268

我正在尝试向我的旧 csv 文件添加一个新行。基本上,每次我运行 Python 脚本时它都会更新。

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

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

4

8 回答 8

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

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

于 2010-03-02T14:25:51.047 回答
216

我更喜欢使用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: a bytes-like object is required, not 'str' in python and CSV in Python 3.6。newline=''正如 Natacha 建议的那样,添加将导致Python 2 和 3 之间向后不兼容

于 2016-06-06T09:46:15.213 回答
32

根据@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'})

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

于 2018-06-21T16:47:49.880 回答
14

您是否以“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+' 打开文件进行读写。mode 参数是可选的;如果省略,将假定 'r'。

在 Windows 上,附加到模式的 'b' 以二进制模式打开文件,因此还有 'rb'、'wb' 和 'r+b' 等模式。Windows 上的 Python 区分了文本文件和二进制文件;读取或写入数据时,文本文件中的行尾字符会自动稍作更改。这种对文件数据的幕后修改适用于 ASCII 文本文件,但它会破坏 JPEG 或 EXE 文件中的二进制数据。在读写此类文件时要非常小心使用二进制模式。在 Unix 上,将“b”附加到模式并没有什么坏处,因此您可以独立于平台使用它来处理所有二进制文件。

于 2010-03-02T14:26:11.777 回答
12

如果文件存在并包含数据,则可以自动生成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)
于 2019-02-06T11:52:03.417 回答
11

我使用以下方法在 .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'是追加模式。
于 2019-07-18T18:37:18.323 回答
10

如果您使用 pandas,您可以通过以下方式将数据框附加到现有的 CSV 文件中:

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

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

于 2020-10-13T14:21:05.037 回答
5
# 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) 
于 2018-03-15T20:57:18.310 回答