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

时间:2016-12-20 19:58:14

标签: python python-2.7 csv text 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文件看起来不错,除了第一列中的字符(最初为#的字符)部分"覆盖"当我尝试从单元格中手动删除某些字符时,彼此相互对话:

Result

奇怪的是,每次尝试在运行脚本后删除某些字符时,似乎没有关于字符如何变得混乱的公式。我尝试将csv文件编码为unicode无济于事。

感谢。

2 个答案:

答案 0 :(得分:2)

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

  • 您使用TAB作为分隔符行终止符,它会创建一行CSV文件。足够接近“截断”给我
  • quotechar也不应该是空格。

如你所说,这传达了一个很好的副作用: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

这里是输出现在的样子(请注意空单元格是因为一行中有几个逗号)

enter image description here

答案 1 :(得分:1)

更多问题:

  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. 根本不清楚包含"奇怪"的句子是什么手段。我们需要确切地看到输出csv文件中的内容。创建一个包含3条记录的小型测试文件(1),'# Online_Resource'(2),"## "(3)以上都不是,运行代码,并显示输出,如下所示:

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