如何在 Python 中将新行附加到旧的 CSV 文件?
- 2025-02-05 13:24:00
- admin 原创
- 98
问题描述:
我正在尝试向我的旧 CSV 文件添加新行。基本上,每次运行 Python 脚本时它都会更新。
现在,我将旧的 CSV 行值存储在列表中,然后删除 CSV 文件并使用新的列表值再次创建它。
我想知道是否有更好的方法可以做到这一点。
解决方案 1:
with open('document.csv','a') as fd:
fd.write(myCsvRow)
使用参数打开文件'a'
允许您将内容附加到文件末尾,而不是简单地覆盖现有内容。 尝试一下。
解决方案 2:
我更喜欢使用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 之间的向后不兼容。
解决方案 3:
根据@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),但我认为它也可以。
解决方案 4:
如果你使用 pandas,则可以通过以下方式将数据框附加到现有的 CSV 文件:
df.to_csv('log.csv', mode='a', index=False, header=False)
使用 mode='a' 我们确保附加而不是覆盖,使用 header=False 我们确保仅附加 df 行的值,而不是 header + 值。
解决方案 5:
您是否以“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+”打开文件进行读取和写入。模式参数是可选的;如果省略,则假定为“r”。
在 Windows 上,模式后面附加“b”会以二进制模式打开文件,因此还有“rb”、“wb”和“r+b”等模式。Windows 上的 Python 区分文本文件和二进制文件;在读取或写入数据时,文本文件中的行尾字符会自动略微改变。这种对文件数据的幕后修改对于 ASCII 文本文件来说没问题,但它会损坏 JPEG 或 EXE 文件中的二进制数据。在读取和写入此类文件时,请务必小心使用二进制模式。在 Unix 上,将“b”附加到模式不会有什么坏处,因此您可以独立于平台地将其用于所有二进制文件。
解决方案 6:
我使用以下方法在 .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("
") # Next line.
[笔记]:
mode='a'
是追加模式。
解决方案 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)
解决方案 8:
# 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)
扫码咨询,免费领取项目管理大礼包!