我想将新行添加到旧的CSV文件中。基本上,每次运行Python脚本时都会更新它。
现在,我将旧的CSV行值存储在列表中,然后删除CSV文件并使用新列表值创建它。
我想知道是否有更好的方法来完成这个任务。
with open('document.csv','a') as fd:
fd.write(myCsvRow)
使用'a'
参数打开文件可以在文件末尾添加内容而不是简单地覆盖现有内容。试试看。
我更喜欢使用标准库中的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'
来避免这种情况,但这将导致您在Python 3.6中遇到TypeError: a bytes-like object is required, not 'str' in python and CSV。如Natacha所建议的那样添加newline=''
将导致在Python 2和3之间出现向后不兼容。
newline=''
:with open(r'name', 'a', newline='') as f:
(在Windows上,Python 3.9) - Eugene Chabanov基于@G M的回答并注意@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'})
我没有尝试使用普通的写作工具(不带字典),但我认为也应该没问题。
如果您使用pandas,可以通过以下方式将数据框附加到现有的CSV文件:
df.to_csv('log.csv', mode='a', index=False, header=False)
使用mode='a',确保我们进行追加而不是覆盖,并且使用header=False确保仅追加df行的值,而不包括标题+值。
你是不是使用了'a'模式而不是'w'模式来打开文件?
请参考Python文档中的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 +”打开文件进行读取和写入。模式参数是可选的;如果省略,则假定为“r”。csv.DictWriter
的fieldname
参数。# 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)
我使用以下方法在 .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'
表示追加模式。for
来实现。 - Benyamin Jafari# 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)