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 文件编码为 unicode 无济于事。
谢谢。
您选择了 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
这是现在的输出结果(请注意,空单元格是因为一行中有多个逗号)
更多问题:
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:]
以删除不需要的文本
完全不是很清楚包含"bizarre"的那句话是什么意思。我们需要准确查看输出的 csv 文件中的内容。创建一个包含 3 条记录的小型测试文件 (1) '# Online_Resource'
(2) "## "
(3) none 以上,运行 您的代码,并显示输出,像这样:
print repr(open('testout.csv', 'rb').read())
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 文件编码为 unicode 无济于事。
谢谢。
您选择了 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
这是现在的输出结果(请注意,空单元格是因为一行中有多个逗号)
更多问题:
line=line.strip(" ")
删除前导和尾随空格。它不会删除\r
或\n
...尝试line=line.strip()
删除前导和尾随空格你会在一个单元格中得到包括逗号在内的所有行,因为你没有以某种方式将其拆分......就像使用
csv.reader
实例一样。看这里: https://docs.python.org/2/library/csv.html#csv.readerstr.lstrip
非默认 arg 被视为一组要删除的字符,因此'## '
与'# '
具有相同的效果。如果guff.startswith('## ')
则执行guff = guff[3:]
以删除不需要的文本完全不是很清楚包含"bizarre"的那句话是什么意思。我们需要准确查看输出的 csv 文件中的内容。创建一个包含 3 条记录的小型测试文件 (1)
'# Online_Resource'
(2)"## "
(3) none 以上,运行 您的代码,并显示输出,像这样:
print repr(open('testout.csv', 'rb').read())