如何在Python中添加新行到旧CSV文件?

我试图添加一个新行到我的旧CSV文件。基本上,每次运行Python脚本时它都会更新。

现在,我将旧的CSV行值存储在一个列表中,然后删除CSV文件,并再次使用新的列表值创建它。

我想知道有没有更好的方法。

642813 次浏览
with open('document.csv','a') as fd:
fd.write(myCsvRow)

使用'a'参数打开一个文件允许你在文件末尾追加内容,而不是简单地覆盖现有内容。试试。

你打开文件的模式是“a”而不是“w”吗?

请参阅python文档中的读写文件

7.2. 读写文件

Open()返回一个文件对象,最常与两个参数一起使用:Open (filename, mode)。

>>> f = open('workfile', 'w')
>>> print f <open file 'workfile', mode 'w' at 80a0960>

第一个参数是包含文件名的字符串。第二个论点是 另一个包含几个字符的字符串,用来描述 该文件将被使用。当文件仅为时,Mode可以为'r' 读取,'w'只表示写入(现有的同名文件将 被擦除),'a'打开文件进行追加;写入的任何数据 文件会自动添加到文件末尾。'r+'打开for的文件 包括阅读和写作。mode参数是可选的;'r'将是

在Windows上,'b'附加到mode以二进制模式打开文件,因此 还有'rb'、'wb'和'r+b'等模式。Windows上的Python 区分文本文件和二进制文件;的行 文本文件中的字符在数据时自动轻微改变 已读或已写。这是对文件数据的幕后修改 是很好的ASCII文本文件,但它会破坏二进制数据那样 JPEG或EXE文件。读取时要非常小心地使用二进制模式 以及编写这样的文件。在Unix上,在后面加一个'b'没有什么坏处 模式,因此您可以对所有二进制文件独立地使用它 文件。< / p >

我更倾向于使用标准库中的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'来避免它们,然而,这会导致你在Python 3.6中使用TypeError:需要一个字节类对象,而不是'str'python和CSV格式。添加newline='',就像Natacha建议的那样,会得到Python 2和3之间的向后不兼容

# 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)

根据@ gm的回答并注意@John La Rooy的警告,我能够追加一个以'a'mode打开文件的新行。

即使在windows中,为了避免换行问题,也必须将其声明为newline=''

现在你可以用'a'mode打开文件(不带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'})

我没有尝试使用普通的写作者(没有字典),但我认为它也可以。

如果文件存在并且包含数据,则可以自动为csv.DictWriter生成fieldname参数:

# 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)

我使用以下方法在.csv文件中添加新行:

pose_x = 1
pose_y = 2


with open('path-to-your-csv-file.csv', mode='a') as file_:
file_.write("{},{}".format(pose_x, pose_y))
file_.write("\n")  # Next line.

[请注意]:

  • mode='a'是追加模式。

如果你使用pandas,你可以用这种方式将你的数据帧附加到一个现有的CSV文件中:

df.to_csv('log.csv', mode='a', index=False, header=False)

使用mode='a',我们确保我们附加,而不是覆盖;使用header=False,我们确保我们只附加df行的值,而不是header +值。