Python 如何将字典写入已包含文本的行上的CSV文件?
我正在使用python 3.6.0。我以前曾为CSV文件编写过词典,但从未在已经包含文本的行上编写过词典。我现在在这方面遇到了麻烦。这是我的密码:Python 如何将字典写入已包含文本的行上的CSV文件?,python,csv,dictionary,file-writing,Python,Csv,Dictionary,File Writing,我正在使用python 3.6.0。我以前曾为CSV文件编写过词典,但从未在已经包含文本的行上编写过词典。我现在在这方面遇到了麻烦。这是我的密码: import csv f='/Users/[my name]/Documents/Webscraper/tests/output_sheet_1.csv' bigdict = {'ex_1': 1, 'ex_2': 2, 'ex_3': 3} with open(f, 'r+') as file: fieldnames=['ex_1','e
import csv
f='/Users/[my name]/Documents/Webscraper/tests/output_sheet_1.csv'
bigdict = {'ex_1': 1, 'ex_2': 2, 'ex_3': 3}
with open(f, 'r+') as file:
fieldnames=['ex_1','ex_2','ex_3']
writer = csv.DictWriter(file, fieldnames=fieldnames,delimiter=',')
if '\n' not in file.readline()[-1]:
file.write('\n')
writer.writerow(bigdict)
当我运行这个程序时,python会在包含字段名的行之后的第一行追加字典,从字段名下面的最后一个单元格开始。换句话说,第一行包含许多条目,包括后三个单元格中的ex_1
、ex_2
和ex_3
。在第二行中,除ex_1
、ex_2
和ex_3
下的值为空外,所有单元格中都存储了值。Python将整数1
写入ex_3
下方,并将2
和3
写入其右侧的单元格中
我想重新定位它们,使每个数字都位于各自的字段名单元格下。我该怎么做,为什么会这样?谢谢。您有两个问题:
writerow()
将添加一个尾随换行符,因此通常这不会是问题。但是,如果该文件已被手动编辑且缺少尾随换行符,则会导致新行追加到最后一行的末尾0
,则它存在但为空。如果文件不存在,则引发OSError
异常<代码>写入标题用于发出此信号
第二个问题有点棘手。如果以二进制模式打开文件,则可以查找文件的最后一个字节并将其读入。可以检查它是否为换行符。如果您的文件曾经使用过其他编码,则需要对其进行更改。然后可以在追加模式下重新打开文件,并写入新行
这一切都可以通过以下方式完成:
import csv
filename = '/Users/[my name]/Documents/Webscraper/tests/output_sheet_1.csv'
bigdict = {'ex_1': 1, 'ex_2': 2, 'ex_3': 3}
# Does the file exist? If not (or it is empty) write a header
try:
write_header = os.path.getsize(filename) == 0
except OSError:
write_header = True
# If the file exists, does it end with a newline?
if write_header:
no_ending_newline = False
else:
with open(filename, 'rb') as f_input:
f_input.seek(-1, 2) # move to the last byte of the file
no_ending_newline = f_input.read() != b'\n'
with open(filename, 'a', newline='') as f_output:
fieldnames = ['ex_1','ex_2','ex_3']
csv_writer = csv.DictWriter(f_output, fieldnames=fieldnames)
if write_header:
csv_writer.writeheader()
if no_ending_newline:
f_output.write('\n')
csv_writer.writerow(bigdict)
您是否尝试了
writer.writeheader();writer.writerow(bigdict)
?@pstatix我尝试使用writer.writeheader()
,但是,正如预期的那样,它创建了另一个头,我不想要,因为它已经在CSV文件中了。我可以把文件中的内容重写成一个新的文件,但我不想这样做,因为文件太大了,我希望我的代码更有效。我认为这种情况不会像你想象的那样发生。仅仅因为这些头的存在并不意味着它们会自动写在它们下面,因为您已经实例化了一个DictWriter
。好的,据我所知,到目前为止,python假定未列出的字段名下的所有内容都是空的。如果不是这样,它基本上会弄乱格式。话虽如此。。。将整个过程重写为新的CSV文件是最有效的方法吗?