Python CSV编写器在Excel 2013中按顺序截断字符

Python CSV编写器在Excel 2013中按顺序截断字符,python,python-2.7,csv,text,excel-2013,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

我对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文件看起来不错,除了第一列中的字符(最初带有
#
的字符)在我尝试手动从单元格中删除一些字符时,部分“覆盖”了彼此:

同样奇怪的是,每次我在运行脚本后试图删除一些字符时,似乎没有公式来解释这些字符是如何变得混乱的。我尝试将csv文件编码为unicode,但没有成功


谢谢。

您选择了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
请注意,除非删除
分隔符='\t
(恢复为默认逗号),否则文件不会正确显示在excel中

还请注意,对于Python 3,您需要将
open(csvfile,“wb”)替换为f
,将
open(csvfile,“w”,newline='')替换为f

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

更多问题:

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

  • 你把所有的行包括逗号都放在一个单元格里,因为你没有把它分开。。。比如使用
    csv.reader
    实例。请看这里:

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

  • 包含“奇异”的句子到底是什么意思还不是很清楚。我们需要确切地看到输出csv文件中的内容。创建一个包含3条记录的小测试文件(1)使用
    “#Online_Resource”
    (2)使用
    “##”
    (3)以上任何一项,运行代码,并显示输出,如下所示:


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

    您是否可以尝试
    csv.writer(f,dialogue='excel',delimiter='\t')
    而不使用其他非常奇怪的参数。行终止符和分隔符必须不同。quotechar最好设置为双引号。为什么一直打开输出文件?在函数的开头打开它一次,我认为问题在于您使用了相同的字符作为列分隔符和行终止符。这对我来说没有多大意义。由于您当前的代码将输入作为一个简单的文本文件处理,逗号不可能转换为单元格。你确定你在给我们看代码的真实版本吗?是的,这是真实的代码。这就是为什么我有delimiter=lineterminator的奇特配对,因为它似乎对逗号结构“有效”,但正如我们所看到的,它实际上不起作用。当我只保留默认参数时,csv模块会将字符串写入一个单元格(包括逗号)。检查我的新提议!非常感谢你,让·弗朗索瓦。您的代码更加直观。对于这些任务,我对Python是相当陌生的,因此非常感谢您的csv教程,本质上,“逗号分割”仅在输入不包含任何包含分隔符(逗号)或引号的字段时才有效。。。csv模块的全部要点在于,它为用户提供了一些棘手的功能you@JohnMachin是的,现在说得通了。我想我做的太多了,因为我不知道csv模块的某些功能。嗨,约翰,(1)和(3)是疏忽。固定的。(4) 输出是OP中的屏幕截图。我将代码更改为
    write=csv.writer(f,dialogue='excel',delimiter='\t',)
    ,正如Jean Francois所说,输出为:
    carbonate%碳酸钙,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
    每个单元格。@SamuelLockshin Noaaffilia(2)我添加了一个指向csv.writer的文档的链接(4)出于调试目的,我们希望查看输出csv文件中的内容;这不能通过excel屏幕上的逆向工程来完成,谢谢您的文档。让·弗朗索瓦提供了一个精确的解决方案。在将行传递到csv.writer之前,必须删除分隔符并拆分行。最好也将csv文件从循环中删除。这一切从直觉上讲更有意义。谢谢你指出我的错误。