【问题标题】:Python parse csv file - replace commas with colonsPython解析csv文件 - 用冒号替换逗号
【发布时间】:2011-10-01 14:11:15
【问题描述】:

我怀疑这是一个常见问题,但我似乎找不到答案。我正在尝试从 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)

谁能帮我解决这个问题?提前感谢您的帮助。

【问题讨论】:

  • 我从答案中看到它们是对您问题的两种解释。有些人认为您想将分隔符更改为冒号。其他人认为您想替换每个项目中的任何逗号。是哪个?
  • 对于我的问题含糊不清,我深表歉意。我想问如何将分隔符从逗号更改为冒号。我不知道它就像将分隔符指定为冒号一样简单。出于某种原因,我认为这行不通。谢谢大家的帮助!

标签: python parsing csv


【解决方案1】:

答案比你想象的要容易。你只需要为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 处理。

【讨论】:

  • 非常感谢您的帮助!
  • ...rows 未在此处定义。我不确定它应该指的是什么。
  • writer.writerows(rows)替换成writer.writerows(list(reader)),或者更好的writer.writerows(reader)
【解决方案2】:

如果您希望读取带有逗号分隔符的 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 answer

【讨论】:

  • 这里的缺点是您不会关闭已打开的文件对象,例如。 f.close()。使用with open(...) 这会自动完成。最好给它们命名并在不再需要它们后关闭它们。
  • 利弊,在这种特殊情况下,with open(...) 只是自动关闭在我看来并没有太大帮助。
  • 确实 @Bhanunday SharmaU 已弃用,因此我将其删除。显然newline=Nonedefault 并且和U 应该做的一样:)
【解决方案3】:

我将在@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 是的。你说的对。但当时我没有发表评论的特权。无论如何,感谢原始和更新的答案。
【解决方案4】:

我正在从 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 #)

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      如果您只是用冒号替换逗号,则根本不需要使用 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 文件的其他位置使用逗号。

      【讨论】:

      • 第4行有错字; line.replace 应该是lines.replace
      • CSV 有一些不同的风格,但大多数都有特殊的方法来转义数据中的逗号,需要考虑到这一点,所以简单的替换是行不通的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      相关资源
      最近更新 更多