将新行追加到旧的csv文件python中

时间:2010-03-02 14:23:34

标签: python csv append writer

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

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

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

8 个答案:

答案 0 :(得分:196)

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

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

答案 1 :(得分:109)

我更喜欢使用标准库中的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'来避免使用它们。

答案 2 :(得分:14)

基于@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),但我认为也可以。

答案 3 :(得分:12)

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

请参阅python docs中的Reading and Writing Files

  

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'并没有什么坏处   模式,所以你可以平台独立使用它为所有二进制文件   文件。

答案 4 :(得分:4)

如果文件存在并且包含数据,则可以自动为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)

答案 5 :(得分: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) 

答案 6 :(得分:0)

我这样做是在.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")

答案 7 :(得分:0)

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

animatable.propertiesCSS

对于mode ='a',我们确保添加而不是覆盖,对于header = False,我们确保仅添加df行的值,而不添加header +值。