我试图添加一个新行到我的旧CSV文件。基本上,每次运行Python脚本时它都会更新。
现在,我将旧的CSV行值存储在一个列表中,然后删除CSV文件,并再次使用新的列表值创建它。
我想知道有没有更好的方法。
我试图添加一个新行到我的旧CSV文件。基本上,每次运行Python脚本时它都会更新。
现在,我将旧的CSV行值存储在一个列表中,然后删除CSV文件,并再次使用新的列表值创建它。
我想知道有没有更好的方法。
当前回答
如果你使用pandas,你可以用这种方式将你的数据帧附加到一个现有的CSV文件中:
df.to_csv('log.csv', mode='a', index=False, header=False)
使用mode='a',我们确保我们附加,而不是覆盖;使用header=False,我们确保我们只附加df行的值,而不是header +值。
其他回答
# I like using the codecs opening in a with
field_names = ['latitude', 'longitude', 'date', 'user', 'text']
with codecs.open(filename,"ab", encoding='utf-8') as logfile:
logger = csv.DictWriter(logfile, fieldnames=field_names)
logger.writeheader()
# some more code stuff
for video in aList:
video_result = {}
video_result['date'] = video['snippet']['publishedAt']
video_result['user'] = video['id']
video_result['text'] = video['snippet']['description'].encode('utf8')
logger.writerow(video_result)
我更喜欢使用标准库中的csv模块和with语句来避免打开文件的解决方案。
关键是在打开文件时使用“a”作为追加。
import csv
fields=['first','second','third']
with open(r'name', 'a') as f:
writer = csv.writer(f)
writer.writerow(fields)
如果你使用的是Python 2.7,你可能会在Windows中遇到多余的新行。您可以尝试使用'ab'而不是'a'来避免它们,但这会导致TypeError:需要一个字节类对象,而不是python中的'str'和python 3.6中的CSV。正如Natacha所建议的那样,添加换行符= "将导致Python 2和3之间的向后不兼容。
如果文件存在并且包含数据,那么可以为csv生成fieldname参数。DictWriter自动:
# read header automatically
with open(myFile, "r") as f:
reader = csv.reader(f)
for header in reader:
break
# add row to CSV file
with open(myFile, "a", newline='') as f:
writer = csv.DictWriter(f, fieldnames=header)
writer.writerow(myDict)
基于@ gm的回答,并注意@John La Rooy的警告,我能够追加一个以“a”模式打开文件的新行。
即使在windows中,为了避免换行符问题,也必须声明为newline= "。 现在您可以以'a'模式(不带b)打开文件。
import csv
with open(r'names.csv', 'a', newline='') as csvfile:
fieldnames = ['This','aNew']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writerow({'This':'is', 'aNew':'Row'})
我没有尝试使用普通的写作者(没有字典),但我认为它也可以。
如果你使用pandas,你可以用这种方式将你的数据帧附加到一个现有的CSV文件中:
df.to_csv('log.csv', mode='a', index=False, header=False)
使用mode='a',我们确保我们附加,而不是覆盖;使用header=False,我们确保我们只附加df行的值,而不是header +值。