我对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无济于事。
感谢。
答案 0 :(得分:2)
你选择了excel方言,但你用奇怪的参数覆盖它:
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
。
这里是输出现在的样子(请注意空单元格是因为一行中有几个逗号)
答案 1 :(得分:1)
更多问题:
line=line.strip(" ")
删除前导和尾随空格。它不会删除\r
或\n
...尝试line=line.strip()
删除前导空格和尾随空格
你在一个单元格中得到所有的行,包括逗号,因为你还没有以某种方式将它拆分......就像使用csv.reader
实例一样。看这里:
https://docs.python.org/2/library/csv.html#csv.reader
str.lstrip
非默认arg被视为要移除的一组字符,因此'## '
与'# '
具有相同的效果。如果guff.startswith('## ')
然后执行guff = guff[3:]
以删除不需要的文字
根本不清楚包含"奇怪"的句子是什么手段。我们需要确切地看到输出csv文件中的内容。创建一个包含3条记录的小型测试文件(1),'# Online_Resource'
(2),"## "
(3)以上都不是,运行代码,并显示输出,如下所示:
print repr(open('testout.csv', 'rb').read())