用Python解析csv文件 - 将逗号替换为冒号

16

我怀疑这是一个常见的问题,但我似乎找不到答案。我正在尝试从csv文件中删除所有逗号,并用冒号替换它们。我通常会使用sed或vi来完成这个任务,但我需要使用纯python实现。目前为止,我想出了以下代码:

import csv

with open("temp.csv", mode="rU") as infile:
    reader = csv.reader(infile, dialect="excel")    
    with open("temp2.txt", mode="w") as outfile:
        writer = csv.writer(outfile)
        for rows in reader:
            for parsed_item in rows:
                parsed_item = rows.replace(',', ':') # I can't do this with a list!
                writer.writerow(parsed_item)

有谁能帮我解决如何做到这一点吗?非常感谢您的帮助。


1
从答案中我看到了两种对你问题的解释。一些人认为你想要将分隔符更改为冒号。另一些人认为你想要替换每个项中的逗号。你到底是想要哪个呢? - Steven Rumbalski
对于我的问题表述不够清晰,我深感抱歉。我的本意是询问如何将分隔符从逗号改为冒号。我并不知道只需指定冒号作为分隔符就可以轻松实现。出于某种原因,我一直认为这样做行不通。非常感谢大家的帮助! - drbunsen
6个回答

29

答案比你想象的更简单。你只需要为csv.writer设置分隔符:

import csv

row = #your data

with open("temp.csv", mode="rU") as infile:
    reader = csv.reader(infile, dialect="excel")    
    with open("temp2.txt", mode="w") as outfile:
        writer = csv.writer(outfile, delimiter=':')
        writer.writerows(rows)

您尝试使用: 替换 , 的代码不会起作用,因为该行已被csv.reader处理。


22
这里未定义rows,我不确定它应该指代什么。 - Ramy
2
writer.writerows(rows)替换为writer.writerows(list(reader)),或者更好的是writer.writerows(reader) - rlaverde

12

如果你想用逗号分隔符读取 csv 文件,并用分号分隔符将其写入另一个文件,我认为更直接的方法是:

reader = csv.reader(open("input.csv", "r"), delimiter=',')
writer = csv.writer(open("output.csv", 'w'), delimiter=';')
writer.writerows(reader)

我发现这个例子比使用 with open(...) 更容易理解。如果你使用逗号和分号作为分隔符处理文件,你可以使用csv文件的 Sniffer 在读取文件之前检测使用了哪个分隔符(链接中有示例)。

另外,如果你想在同一个文件中进行重写,请查看这个 stackoverflow答案


这里的缺点是您没有关闭已打开的文件对象,例如 f.close()。使用 with open(...) 可以自动完成此操作。最好在不再需要它们时将它们命名并关闭。 - Swedgin
在这种情况下,使用with open(...)只是为了自动关闭文件,并不是很有帮助,我认为它有利有弊。 - Sylhare
确实,@Bhanunday Sharma,U已经被弃用了,所以我将其删除了。显然,newline=None是默认设置,并且执行与U应该执行的相同操作 :) - Sylhare

1
我将在@Sylhare的答案基础上进行回答。在python3中,“U”模式已被弃用。因此,以下解决方案适用于我:
import csv

reader = csv.reader(open("input.csv", newline=None), delimiter=',')
writer = csv.writer(open("output.csv", 'w'), delimiter=':')
writer.writerows(reader)

这本来可以是一条注释,我更新了它 ;) - Sylhare
@Sylhare 是的,你说得对。但那时我没有评论的特权。无论如何,感谢原始答案和更新后的答案。 - Bhanuday Sharma

0
我正在从JSON原始数据编写csv文件,并注意到DictWriter模块还支持不同的分隔符。例如:
with open('file_1.csv', 'w', encoding="utf-8-sig", newline = '') as myfile:
    wr = csv.DictWriter(myfile, fieldnames = table_fields, delimiter=';')
    wr.writeheader()
    wr.writerows(# my data #)

-1

假设CSV文件是以逗号分隔的,并且您想要替换每个条目中的逗号,我认为问题在于替换了错误的项目:

for rows in reader:
    for parsed_item in rows:
        parsed_item = parsed_item.replace(',', ':') # Change rows to parsed_item
        writer.writerow(parsed_item)

-2

如果你只是将逗号替换为冒号,那么你完全不需要使用csv解析器。

with open("file.csv", 'r') as f:
    with open("temp.csv", 'w') as t:
        for lines in f:
            new_line = line.replace(",",":")
            t.write(new_line)

唯一的注意事项是在 CSV 文件中不能有其他逗号。

第四行有一个错别字;line.replace 应该是 lines.replace。 - Ron7
1
CSV有一些不同的版本,但在大多数版本中,有特殊的方法来转义数据内部的逗号,这需要考虑到,因此简单的替换是行不通的。 - Gnudiff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接