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


207

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

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

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

Answers:


246
with open('document.csv','a') as fd:
    fd.write(myCsvRow)

使用'a'参数打开文件可以使您追加到文件末尾,而不仅仅是覆盖现有内容。试试看


2
我试过了fp = open(csv_filepathwithname,'wa')writer = csv.writer(fp)somelist = [3,56,3,6,56] writer.writerow((somelist))但只有最后一行在文件。
laspal

该方法假定要追加的项目以逗号分隔,但情况并非总是如此。然后,write方法将不会维护csv分隔符。从这个意义上讲,下面的答案更加可靠。
sheth7

152

我更喜欢使用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中的CSVnewline=''正如Natacha所建议的那样,添加会导致您在Python 2和3之间向后不兼容


24

基于@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'})

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


12

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

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

7.2。读写文件

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

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

第一个参数是包含文件名的字符串。第二个参数是另一个包含一些字符的字符串,这些字符描述了文件的使用方式。当仅读取文件时,模式可以为“ r”,仅用于写入时为“ w”(具有相同名称的现有文件将被删除),并且“ a”打开文件以进行追加;写入文件的所有数据都会自动添加到末尾。“ r +”打开文件以供读取和写入。mode参数是可选的;如果省略,则假定为“ r”。

在Windows上,附加到模式的'b'以二进制模式打开文件,因此也有'rb','wb'和'r + b'之类的模式。Windows上的Python区分文本文件和二进制文件。读取或写入数据时,文本文件中的行尾字符会自动更改。这种对文件数据的幕后修改对于ASCII文本文件来说是很好的选择,但它会破坏JPEG或EXE文件中的二进制数据。读写此类文件时,请务必小心使用二进制模式。在Unix上,将'b'附加到该模式并没有什么坏处,因此您可以在平台上独立地将其用于所有二进制文件。


可能是您可以使答案更详尽,然后看起来
才是

@user,我添加了一个链接-对您有帮助吗?
John La Rooy

7

如果文件存在并且包含数据,则可以自动生成fieldname参数csv.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)

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

1
请修正您的缩进。答案也可以从解释中受益-这些答案也吸引了更多的赞誉。
T先生

这是一些简单的代码,它为追加模式打开文件,写出标题rec,然后遍历aList中的视频记录。
markkaufman

2

我使用这种方式在.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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.