将新行添加到旧的csv文件python

问题描述 投票:170回答:7

我正在尝试在旧的csv文件中添加新行。基本上,每次我运行Python脚本时都会对其进行更新。

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

想知道有没有更好的方法可以做到这一点。

python csv append writer
7个回答
213
投票
with open('document.csv','a') as fd:
    fd.write(myCsvRow)

使用'a'参数打开文件,您可以将其附加到文件的末尾,而不是简单地覆盖现有内容。试试看。


120
投票

我更喜欢使用标准库中的csv模块和csv语句来避免打开该文件。

关键点是在打开文件时使用with进行附加。

with

如果您使用的是Python 2.7,则可能会在Windows中遇到多余的新行。您可以尝试使用'a'而不是import csv fields=['first','second','third'] with open(r'name', 'a') as f: writer = csv.writer(f) writer.writerow(fields) 来避免它们,但是这会在Python 3.6中导致'ab'。根据Natacha的建议,添加'a'将导致您TypeError: a bytes-like object is required, not 'str' in python and CSV


16
投票

基于@GM的答案,并注意@John La Rooy的警告,我能够添加一个新行,以newline=''模式打开文件。

即使在Windows中,为了避免换行问题,也必须将其声明为a backward incompatibility between Python 2 and 3

现在您可以在'a'模式下打开文件(不带b)。

newline=''

我没有和普通作家一起尝试(没有字典),但我认为也可以。


12
投票

您是否以'a'模式而不是'w'模式打开文件?

请参见python文档中的'a'

7.2。读写文件

open()返回文件对象,并且最常与两个参数一起使用:open(文件名,模式)。

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'})

第一个参数是包含文件名的字符串。第二个参数是另一个包含一些字符的字符串,描述了其中的方式该文件将被使用。当文件仅是读取,“ w”仅用于写入(具有相同名称的现有文件将被删除),并且“ a”打开文件以进行附加;任何写入的数据文件将自动添加到末尾。 'r +'打开文件阅读和写作。 mode参数是可选的; 'r'将是假定是否省略。

在Windows上,附加到模式的'b'会以二进制模式打开文件,因此还有“ rb”,“ wb”和“ r + b”之类的模式。 Windows上的Python区分文本文件和二进制文件;行尾数据时,文本文件中的字符会自动稍作更改被读取或写入。对文件数据的幕后修改对于ASCII文本文件来说很好,但是那样会破坏二进制数据在JPEG或EXE文件中。阅读时请务必小心使用二进制模式并编写此类文件。在Unix上,将'b'附加到模式,因此您可以独立于平台使用所有二进制文件文件。



4
投票

如果文件存在并且包含数据,则可以自动为>>> f = open('workfile', 'w') >>> print f <open file 'workfile', mode 'w' at 80a0960> 生成# 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) 参数:

fieldname

1
投票

我通过这种方式在.csv文件中添加新行:

csv.DictWriter
© www.soinside.com 2019 - 2024. All rights reserved.