Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将字典写入已包含文本的行上的CSV文件?_Python_Csv_Dictionary_File Writing - Fatal编程技术网

Python 如何将字典写入已包含文本的行上的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

我正在使用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','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文件是最有效的方法吗?