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

las*_*pal 174 python csv append writer

我想在我的旧csv文件中添加一个新行.基本上,每次运行Python脚本时它都会更新.

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

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

ink*_*dmn 217

with open('document.csv','a') as fd:
    fd.write(myCsvRow)
Run Code Online (Sandbox Code Playgroud)

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

  • 该方法假设所附加的项目是用逗号分隔的,但情况可能并非总是如此。那么 write 方法将不会维护 csv 分隔符。从这个意义上来说,下面的答案更加有力。 (3认同)
  • 我试过fp = open(csv_filepathwithname,'wa')writer = csv.writer(fp)somelist = [3,56,3,6,56] writer.writerow((somelist))但只有最后一行得到追加文件. (2认同)

G M*_*G M 122

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

关键点是'a'在打开文件时使用附加功能.

import csv   
fields=['first','second','third']
with open(r'name', 'a') as f:
    writer = csv.writer(f)
    writer.writerow(fields)
Run Code Online (Sandbox Code Playgroud)

您可能会在Windows中遇到多余的新行.您可以尝试使用'ab'而不是使用它们'a'.

  • 对我来说,这段代码添加了多余的新行,所以我在这一行添加了一个 ```newline=''`` : ```with open(r'name', 'a', newline='') as f: ``(Windows、Python 3.9) (6认同)
  • 可能出现的恼人问题:如果 csv 文件不以换行符结尾,这将扩展最后一行而不是添加新行。 (3认同)
  • 这是问题的更好答案,应标记为正确答案。csv 包确保格式正确,事实上我想不出使用纯文本比 csv 有任何优势。 (2认同)

Nat*_*cha 17

根据@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'})
Run Code Online (Sandbox Code Playgroud)

我没有尝试过常规作家(没有Dict),但我认为它也可以.


Joh*_*ooy 12

你打开文件的模式是'a'而不是'w'?

请参阅python文档中的读取和写入文件

7.2.读写文件

open()返回一个文件对象,最常用的有两个参数:open(filename,mode).

>>> f = open('workfile', 'w')
>>> print f <open file 'workfile', mode 'w' at 80a0960>
Run Code Online (Sandbox Code Playgroud)

第一个参数是包含文件名的字符串.第二个参数是另一个字符串,其中包含一些描述文件使用方式的字符.当只能读取文件时,模式可以是'r',仅写入的'w'(将删除具有相同名称的现有文件),'a'打开文件以进行追加; 写入文件的任何数据都会自动添加到最后.'r +'打开文件进行读写.mode参数是可选的; 如果省略,则会假设'r'.

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

  • 也许你可以让你的答案更详细,然后它看起来像一个真正的答案:-) (2认同)

Ron*_*ian 11

如果文件存在并包含数据,则可以自动生成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)
Run Code Online (Sandbox Code Playgroud)


Ben*_*ari 7

我按照以下方法在 .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.
Run Code Online (Sandbox Code Playgroud)

[注意]:

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


小智 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) 
Run Code Online (Sandbox Code Playgroud)


Ann*_*ler 5

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

df.to_csv('log.csv', mode='a', index=False, header=False)
Run Code Online (Sandbox Code Playgroud)

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