我正在尝试将数据附加到CSV文件中。我希望能够在ExcelMacOS中不时手动更改文件,然后重新运行python程序。
但是,当我打开文件并将其保存在ExcelMacOS中时,它会删除硬返回。然后在随后的运行中,缺少硬返回会打乱格式。
with open("test.csv", 'a', newline='', encoding='utf-8') as csvfile:
fieldnames = ['ID', 'Name']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writerow({'ID': "1", 'Name': "Frank"})
writer.writerow({'ID': "2", 'Name': "Bob"})
在初始python运行之后
$ cat -e test.csv
1,Frank^M$
2,Bob^M$
在MacOS 上手动保存在Excel中之后
$ cat -e test.csv
1,Frank^M$
2,Bob
第二次运行python程序后。请注意格式混乱。
$ cat -e test.csv
1,Frank^M$
2,Bob1,Frank^M$
2,Bob^M$
我认为您正在尝试利用附加模式,当Excel没有添加(或直接删除(尾部换行符时,您的流程就会中断。
最简单的答案是;不要创建一个依赖于最后换行的过程;。Excel不必包含它^1:
2. The last record in the file may or may not have an ending line
break. For example:
aaa,bbb,ccc CRLF
zzz,yyy,xxx
我不能说什么时候追加是正确的做法,但我认为这对CSV来说是错误的。
相反,始终将您的数据视为CSV。。。总是使用CSV模块的读取器和写入器,因为他们可以处理CSV规范的模糊性;没有最后的新行";这对他们来说不是问题。
以下是Excel中的数据模型:
cat -e test.csv
1,Frank^M$
2,Bob
运行此:
import csv
Fieldnames = ["ID", "Name"]
# Normalize previous CSV data into `previous_rows`
with open("test.csv", newline="") as csvfile:
reader = csv.DictReader(csvfile, fieldnames=Fieldnames)
previous_rows = list(reader)
# previous_rows = [row for row in reader if row] # to drop empty rows
with open("test.csv", "w", newline="") as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=Fieldnames)
writer.writerows(previous_rows)
# "Append" new rows
writer.writerow({"ID": "3", "Name": "Frank"})
writer.writerow({"ID": "4", "Name": "Bob"})
它只是起作用:
cat -e test.csv
1,Frank^M$
2,Bob^M$
3,Frank^M$
4,Bob^M$