CSV Writer 在 Excel 2013 中按顺序截断字符

CSV Writer truncates characters in sequence in Excel 2013

Python 的 csv 模块有一个有趣的情况。我有一个从文本文件中获取特定行并将它们写入 csv 文件的函数:

import os
import csv

def csv_save_use(textfile, csvfile):
    with open(textfile, "rb") as text:
        for line in text:
            line=line.strip()
            with open(csvfile, "ab") as f:            
                if line.startswith("# Online_Resource"):   
                    write = csv.writer(f, dialect='excel',
                                       delimiter='\t',
                                       lineterminator="\t",
                                       )
                    write.writerow([line.lstrip("# ")])

                if line.startswith("##"):
                    write = csv.writer(f, dialect='excel',
                                       delimiter='\t',
                                       lineterminator="\t",
                                       )
                    write.writerow([line.lstrip("# ")])

这是原始文本文件中的一些字符串示例:

# Online_Resource: https://www.ncdc.noaa.gov/
## Corg%    percent organic carbon,,,%,,paleoceanography,,,N

真正奇怪的是最终的 csv 文件看起来不错,除了第一列中的字符(最初带有 # 的字符)在我尝试手动删除时彼此部分 "overwrite"单元格中的一些字符:

同样奇怪的是,每次我尝试在 运行 脚本之后删除一些字符时,似乎没有公式说明字符是如何变得混乱的。我尝试将 csv 文件编码为 un​​icode 无济于事。

谢谢。

您选择了 excel 方言,但您用奇怪的参数覆盖了它:

  • 您正在使用 TAB 作为分隔符 行终止符,这会创建一个单行 CSV 文件。对我来说足够接近 "truncated"
  • 另外 quotechar 不应该是 space。

如您所述,这传达了一个很好的副作用:csv 模块实际上根据逗号分隔行!

该代码效率低下且容易出错:您在循环中以追加模式打开文件,并且每次都创建一个新的 csv 编写器。最好在循环外完成。

此外,逗号拆分现在必须手动完成。所以更好:也使用 csv 模块来读取文件。我对你的例程的修复建议:

import os
import csv

def csv_save_use(textfile, csvfile):
  with open(textfile, "rU") as text, open(csvfile, "wb") as f:
    write = csv.writer(f, dialect='excel',
                       delimiter='\t')
    reader = csv.reader(text, delimiter=",")
    for row in reader:
        if not row:
            continue  # skip possible empty rows            
        if row[0].startswith("# Online_Resource"):
            write.writerow([row[0].lstrip("# ")])

        elif row[0].startswith("##"):
            write.writerow([row[0].lstrip("# ")]+row[1:]) # write row, stripping the first item from hashes

请注意,文件无法在 excel 中正确显示,除非 删除 delimiter='\t(恢复为默认逗号)

另请注意,对于 Python 3.

,您需要将 open(csvfile, "wb") as f 替换为 open(csvfile, "w",newline='') as f

这是现在的输出结果(请注意,空单元格是因为一行中有多个逗号)

更多问题:

  1. line=line.strip(" ") 删除前导和尾随空格。它不会删除 \r\n ...尝试 line=line.strip() 删除前导和尾随空格

  2. 你会在一个单元格中得到包括逗号在内的所有行,因为你没有以某种方式将其拆分......就像使用 csv.reader 实例一样。看这里: https://docs.python.org/2/library/csv.html#csv.reader

  3. str.lstrip 非默认 arg 被视为一组要删除的字符,因此 '## ''# ' 具有相同的效果。如果 guff.startswith('## ') 则执行 guff = guff[3:] 以删除不需要的文本

  4. 完全不是很清楚包含"bizarre"的那句话是什么意思。我们需要准确查看输出的 csv 文件中的内容。创建一个包含 3 条记录的小型测试文件 (1) '# Online_Resource' (2) "## " (3) none 以上,运行 您的代码,并显示输出,像这样:

print repr(open('testout.csv', 'rb').read())