Python CSV writer不会写入文件的第一行(代码包含:dictwriter、编号行、等于其他CSV的值、元素长度等)

Python CSV writer不会写入文件的第一行(代码包含:dictwriter、编号行、等于其他CSV的值、元素长度等),python,csv,python-2.7,dictionary,Python,Csv,Python 2.7,Dictionary,我的代码几乎可以工作,这让我发疯。我有一个代码,它获取一个csv文件,对行进行编号,查找列中所有字段的字符数,将所有这些内容写入一个新的csv,并将原始csv文件中的所有其他行复制到新的csv中。(我希望这是有道理的) 我的代码: from csv import DictReader, DictWriter with open('file1') as fil1,\ # Original file open('file2') as fil2,\ # File 2 (for line

我的代码几乎可以工作,这让我发疯。我有一个代码,它获取一个csv文件,对行进行编号,查找列中所有字段的字符数,将所有这些内容写入一个新的csv,并将原始csv文件中的所有其他行复制到新的csv中。(我希望这是有道理的)

我的代码:

from csv import DictReader, DictWriter


with open('file1') as fil1,\ # Original file
     open('file2') as fil2,\ # File 2 (for line num and length headers)
     open('file3', 'wb') as fcompout,

# file3 is new file (to be original file +: line numbers and length of 'Name')

    read1 = DictReader(fil1)
    read2 = DictReader(fil2)

    writenum = DictWriter(fcompout, fieldnames=read2.fieldnames)
    writenum.writeheader()


    num = 0 # Number value
    for line1 in read1:
        newdic=dict(line1)
        fil2.seek(0) # resets the reader1 iterator
        for line2 in read2:
            num=num+1 # Number for line num
            outline1=dict(line2)
            outline1['Name']=newdic['Name']
            outline1['Length']=len(newdic['Name']) # Length of Name
            outline1['Line Num']=num # Line Numbers
            outline1['Geo Location']=newdic['Geo Location']
            outline1['IPStart']=newdic['IPStart']
            outline1['IPStop']=newdic['IPStop']
            outline1['Command']=newdic['Command']
            outline1['file']=newdic['file']
            outline1['NA']=newdic['NA']
            outline1['Default']=newdic['Default']
            writenum.writerow(outline1) # Write line to new csv
原始文件(文件1):

对于标题/新列(文件2):

新文件(文件3):

上面的文件3是我的代码的当前输出。注意它是如何缺少file1中的第一行的。如果我改变顺序先做另一行并不重要,它总是缺少第一行,所有其他行看起来都很完美。我想不出来

请帮忙

谢谢,
B0T

我不太清楚您在那里做什么,但这要容易得多:

from csv import DictReader, DictWriter

with open('file1') as fil1, open('file2') as fil2, open('file3', 'wb') as fcompout:
    read1 = DictReader(fil1)
    read2 = DictReader(fil2)
    writenum = DictWriter(fcompout, fieldnames=read2.fieldnames)
    writenum.writeheader()

    for num, line in enumerate(read1):
        line['Length'] = len(line['Name']) # Length of Name
        line['Line Num'] = num+1           # Line Numbers
        writenum.writerow(line)            # Write line to new csv
您不需要重新分配所有这些值,只需添加所需的值即可

结果:

Line Num,Command,Name,Length,file,Geo Location,NA,Default,IPStart,IPStop
1,,DRE EXT Ascent Media,20,,,,,,
2,,DRE United Kingdom UKLONEXT LON Extrane lo0.UKLONEXT sw01,57,,United Kingdom,,,,
3,,DRE United Kingdom UKLONEXT LON Extrane lo0.UKLONEXT sw02,57,,United Kingdom,,,,
4,,DRE United Kingdom UKLONDRE LON Sq lab dynamips test nets,57,,United Kingdom,,,,
5,,DRE United States USLAXCPT Corp Point Multilink_Ascent Media,60,,United States,,,,
6,,DRE United Kingdom UKLONSDD SASD-D CORE01 to SW01,49,,United Kingdom,,,,
7,,DRE United Kingdom UKLONSDD SASD-D CORE01 to SW02,49,,United Kingdom,,,,
8,,DRE United Kingdom UKLONSDD SASD-D CORE02 to SW01,49,,United Kingdom,,,,
9,,DRE United Kingdom UKLONSDD SASD-D CORE02 to SW02,49,,United Kingdom,,,,
10,,DRE United Kingdom UKLONSDD SASD-D CORE01 to CORE02,51,,United Kingdom,,,,
11,,DRE United Kingdom UKLONSDD SASD-D SW01 to SW02,47,,United Kingdom,,,,
12,,DRE United States USLAXMDR SASD-D XC VRF T1/7 Xconnect to vrf via Te1/7,71,,United States,,,,
13,,DRE Hong Kong (China) HKHKGEXT Hongkong Extranet HKHKGDRE SW01 interconnect,75,,"Hong Kong, Hong Kong",,,,
14,,DRE United Kingdom UKLONDRE LON Sq lab test nets,48,,United Kingdom,,,,
15,,DRE United States USLAXTHA SPS Thalberg uslaxtha mdf01 Interconnect,67,,United States,,,,
16,,DRE Hong Kong (China) HKHKGDRE SASD-D Citiplaza to EXT Interconnect,67,,Hong Kong,,,,
17,,SASD-D United States USPHXCAP VRF SW02,38,,United States,,,,

我已经读了你的代码五分钟了,我不明白你在那里做什么。你为什么一遍又一遍地读同一行?还有,为什么
dict()
调用?您已经有了一个
dict
。您也不需要构造一个dict来再次覆盖它的所有字段
outline1={}
应该足够了,不是吗?而且,
with
语句是不完整的。你删除了什么?@TimPietzcker我删除了一些代码中没有的其他文件的语句。一旦它起作用,我还有另一个步骤要做。@TimPietzcker好的,我会在没有第二本字典的情况下尝试它。我在这方面还是新手,很难弄清楚什么时候需要编一本新字典,什么时候不需要。我通常会放弃以前的工作,但并不总是完全一样。
Line Num,Command,Name,Length,file,Geo Location,NA,Default,IPStart,IPStop
1,,DRE United Kingdom UKLONEXT LON Extrane lo0.UKLONEXT sw01,57,,United Kingdom,,,,
2,,DRE United Kingdom UKLONEXT LON Extrane lo0.UKLONEXT sw02,57,,United Kingdom,,,,
3,,DRE United Kingdom UKLONDRE LON Sq lab dynamips test nets,57,,United Kingdom,,,,
4,,DRE United States USLAXCPT Corp Point Multilink_Ascent Media,60,,United States,,,,
5,,DRE United Kingdom UKLONSDD SASD-D CORE01 to SW01,49,,United Kingdom,,,,
6,,DRE United Kingdom UKLONSDD SASD-D CORE01 to SW02,49,,United Kingdom,,,,
7,,DRE United Kingdom UKLONSDD SASD-D CORE02 to SW01,49,,United Kingdom,,,,
8,,DRE United Kingdom UKLONSDD SASD-D CORE02 to SW02,49,,United Kingdom,,,,
9,,DRE United Kingdom UKLONSDD SASD-D CORE01 to CORE02,51,,United Kingdom,,,,
10,,DRE United Kingdom UKLONSDD SASD-D SW01 to SW02,47,,United Kingdom,,,,
11,,DRE United States USLAXMDR SASD-D XC VRF T1/7 Xconnect to vrf via Te1/7,71,,United States,,,,
12,,DRE Hong Kong (China) HKHKGEXT Hongkong Extranet HKHKGDRE SW01 interconnect,75,,"Hong Kong, Hong Kong",,,,
13,,DRE United Kingdom UKLONDRE LON Sq lab test nets,48,,United Kingdom,,,,
14,,DRE United States USLAXTHA SPS Thalberg uslaxtha mdf01 Interconnect,67,,United States,,,,
15,,DRE Hong Kong (China) HKHKGDRE SASD-D Citiplaza to EXT Interconnect,67,,Hong Kong,,,,
16,,SASD-D United States USPHXCAP VRF SW02,38,,United States,,,,
from csv import DictReader, DictWriter

with open('file1') as fil1, open('file2') as fil2, open('file3', 'wb') as fcompout:
    read1 = DictReader(fil1)
    read2 = DictReader(fil2)
    writenum = DictWriter(fcompout, fieldnames=read2.fieldnames)
    writenum.writeheader()

    for num, line in enumerate(read1):
        line['Length'] = len(line['Name']) # Length of Name
        line['Line Num'] = num+1           # Line Numbers
        writenum.writerow(line)            # Write line to new csv
Line Num,Command,Name,Length,file,Geo Location,NA,Default,IPStart,IPStop
1,,DRE EXT Ascent Media,20,,,,,,
2,,DRE United Kingdom UKLONEXT LON Extrane lo0.UKLONEXT sw01,57,,United Kingdom,,,,
3,,DRE United Kingdom UKLONEXT LON Extrane lo0.UKLONEXT sw02,57,,United Kingdom,,,,
4,,DRE United Kingdom UKLONDRE LON Sq lab dynamips test nets,57,,United Kingdom,,,,
5,,DRE United States USLAXCPT Corp Point Multilink_Ascent Media,60,,United States,,,,
6,,DRE United Kingdom UKLONSDD SASD-D CORE01 to SW01,49,,United Kingdom,,,,
7,,DRE United Kingdom UKLONSDD SASD-D CORE01 to SW02,49,,United Kingdom,,,,
8,,DRE United Kingdom UKLONSDD SASD-D CORE02 to SW01,49,,United Kingdom,,,,
9,,DRE United Kingdom UKLONSDD SASD-D CORE02 to SW02,49,,United Kingdom,,,,
10,,DRE United Kingdom UKLONSDD SASD-D CORE01 to CORE02,51,,United Kingdom,,,,
11,,DRE United Kingdom UKLONSDD SASD-D SW01 to SW02,47,,United Kingdom,,,,
12,,DRE United States USLAXMDR SASD-D XC VRF T1/7 Xconnect to vrf via Te1/7,71,,United States,,,,
13,,DRE Hong Kong (China) HKHKGEXT Hongkong Extranet HKHKGDRE SW01 interconnect,75,,"Hong Kong, Hong Kong",,,,
14,,DRE United Kingdom UKLONDRE LON Sq lab test nets,48,,United Kingdom,,,,
15,,DRE United States USLAXTHA SPS Thalberg uslaxtha mdf01 Interconnect,67,,United States,,,,
16,,DRE Hong Kong (China) HKHKGDRE SASD-D Citiplaza to EXT Interconnect,67,,Hong Kong,,,,
17,,SASD-D United States USPHXCAP VRF SW02,38,,United States,,,,