Python 使用dict_writer将行追加到csv

Python 使用dict_writer将行追加到csv,python,python-2.7,csv,Python,Python 2.7,Csv,我使用以下代码将行附加到现有csv文件: counter=1 for thepage in newpages: web_page = urllib2.urlopen(thepage) soup = BeautifulSoup(web_page.read()) fieldnames=["var1", "var2","var3","var4","var5", "var6", "var7"] if counter==1: f = ope

我使用以下代码将行附加到现有csv文件:

counter=1
for thepage in newpages:    
    web_page = urllib2.urlopen(thepage)
    soup = BeautifulSoup(web_page.read())

    fieldnames=["var1", "var2","var3","var4","var5", "var6", "var7"]
    if counter==1:
            f = open('file.csv', 'wb')  
            my_writer = csv.DictWriter(f, fieldnames)
            my_writer.writeheader()
            f.close()

    variables={ele:"MISSING" for ele in fieldnames}
    variables['var1']=str(counter)
    variables['var2']=soup.find_all('strong')[0].text
    variables['var3']=soup.find_all('p')[1].text[0]
    variables['var4']=soup.find_all('p')[1].text[1]
    variables['var4']=soup.find_all('p')[2].text
    variables['var6']=soup.find_all('p')[6].text
    variables['var7']=soup.find_all('p')[7].text
    print variables
    with open('file.csv', 'r+b') as f:
        header = next(csv.reader(f))
        dict_writer = csv.DictWriter(f, header)
        dict_writer.writerow(variables) 
   counter+=1

在循环中创建“变量”字典。循环继续运行,没有问题,但当我查看csv文件时,它已停止在第30行或多或少附加行。我已经检查过了,“变量”字典没有问题,即使我更改了文件并使用了其他变量,在同一行中也或多或少会失败。有什么问题吗

问题是,我认为,您每次都在覆盖该文件。它正在以模式
'r+b'
打开,这会将文件指针定位到文件的开头。因此,后续写入将覆盖文件先前的内容

您可以在追加模式下打开文件,这可以使用模式
'ab'
完成

话虽如此,但无需持续打开文件,也无需在for循环体中输出CSV头。我建议如下:

import csv

counter=1
fieldnames=["var1", "var2","var3","var4","var5", "var6", "var7"]

with open('file.csv', 'wb') as f:    
    my_writer = csv.DictWriter(f, fieldnames)
    my_writer.writeheader()

    for thepage in newpages:    
        web_page = urllib2.urlopen(thepage)
        soup = BeautifulSoup(web_page.read())

        variables={ele:"MISSING" for ele in fieldnames}
        variables['var1']=str(counter)
        variables['var2']=soup.find_all('strong')[0].text
        variables['var3']=soup.find_all('p')[1].text[0]
        variables['var4']=soup.find_all('p')[1].text[1]
        variables['var4']=soup.find_all('p')[2].text
        variables['var6']=soup.find_all('p')[6].text
        variables['var7']=soup.find_all('p')[7].text
        print variables
        my_writer.writerow(variables) 
        counter+=1

你能给我们看更多的代码吗?我们需要一个,您单独发布的代码不足以复制您的问题。您确定这是完整的代码吗?你们在哪里设置柜台?有没有可能在第30排之后,您将计数器重置为1?我忘记将其放入问题中(我再次更新)。这不是任何字典或变量的问题。我在循环中添加了一个打印,看起来一切都很正常。你的意思是将open('file.csv','r+b')更改为f:to with open('file.csv','ab')作为f:?建议的替代方案看起来是一种更好的方法-我不认为
csv
模块的读卡器和写卡器真的支持文件的当前位置,在它不知情的情况下开始更改。另外,
计数器
可能不再需要了…@user2246905:是的,
open('file.csv','ab')
将以二进制附加模式打开文件。@user2246905:为什么您仍在尝试读取文件?无论如何,请尝试
a+b
,它将打开进行读写。我建议您阅读的文档。您是对的唯一问题是将“r+b”更改为“a+b”