2014-01-24 1 views
0

Я собираюсь встретить немного запаха. Только что начал изучать Python за последние пару дней.Python, нужно ввести файл csv в цикле

Вот что я до сих пор

import os 
import urllib2 
from csv import DictReader 

with open('Infodoc 2.txt','r') as infile: 
    incsv = DictReader(infile) 
    for row in incsv: 
     print row['Publisher'] 
     DocIn = row['DocIn'] 
     DocOut = row['DocOut'] 
     WebAddy = row['WebAddy'] 

def moo(): 
    os.rename(DocIn, DocOut) 
    file(DocIn, "wb").write(urllib2.urlopen(WebAddy).read()) 
    hosts0 = open(DocIn,"r") 
    hosts1 = open(DocOut,"r") 
    lines1 = hosts0.readlines() 
    for i,lines2 in enumerate(hosts1): 
     if lines2 != lines1[i]: 
      print "line ", i, " in hosts1 is different \n" 
      print lines2 

moo() 

Что я стремлюсь для каждой линии для моего текстового документа, чтобы пройти через мою функцию. Этот код работает один раз и все. Я хочу, чтобы он мог пройти и вытащить каждую строку и запустить ее, а затем перейти к следующей строке. У меня возникло ощущение, что мне нужно вырвать строки в строки и повторить с какой-то петлей?

Если бы вы могли направить меня в нужном направлении или дать мне мини-пробой, это было бы здорово.

ответ

0

Проблема связана с тем, где вы указываете moo(). Как написано, после вашего импорта

with open('Infodoc 2.txt','r') as infile: 
    incsv = DictReader(infile) 
    for row in incsv: 
     print row['Publisher'] 
     DocIn = row['DocIn'] 
     DocOut = row['DocOut'] 
     WebAddy = row['WebAddy'] 

работает. После того, как цикл через все 'Infodoc 2.txt», moo() определяется

def moo(): 
    os.rename(DocIn, DocOut) #the last DocIn and DocOut from your csv file 
    file(DocIn, "wb").write(urllib2.urlopen(WebAddy).read()) 
    hosts0 = open(DocIn,"r") 
    hosts1 = open(DocOut,"r") 
    lines1 = hosts0.readlines() 
    for i,lines2 in enumerate(hosts1): 
     if lines2 != lines1[i]: 
      print "line ", i, " in hosts1 is different \n" 
      print lines2 

После этого, вы звоните moo()

moo() 

moo() обрабатывает последнюю строку (и только последняя линия) 'Infodoc 2.txt', и ваш программа заканчивается.

Таким образом, вы просто должны двигаться moo() «s определение в точку перед вами проходным файл с небольшим изменением (он должен принять DocIn, DocOut и WebAddy в качестве аргументов), и назовите его внутри цикла, как так

import os 
import urllib2 
from csv import DictReader 

def moo(DocIn, DocOut, WebAddy): 
    os.rename(DocIn, DocOut) 
    file(DocIn, "wb").write(urllib2.urlopen(WebAddy).read()) 
    hosts0 = open(DocIn,"r") 
    hosts1 = open(DocOut,"r") 
    lines1 = hosts0.readlines() 
    for i,lines2 in enumerate(hosts1): 
     if lines2 != lines1[i]: 
      print "line ", i, " in hosts1 is different \n" 
      print lines2 

with open('Infodoc 2.txt','r') as infile: 
    incsv = DictReader(infile) 
    for row in incsv: 
     print row['Publisher'] 
     DocIn = row['DocIn'] 
     DocOut = row['DocOut'] 
     WebAddy = row['WebAddy'] 
     moo(DocIn, DocOut, WebAddy) 

Это не может быть плохой идеей, чтобы добавить main() функцию в случае, если вы хотите повторно использовать moo() вниз по дороге (т.е. импортировать модуль в другом месте).

def main(infodoc): 
    with open(infodoc,'r') as infile: 
     incsv = DictReader(infile) 
     for row in incsv: 
      print row['Publisher'] 
      DocIn = row['DocIn'] 
      DocOut = row['DocOut'] 
      WebAddy = row['WebAddy'] 
      moo(DocIn, DocOut, WebAddy) 

И, наконец, защитить его с if __name__ == '__main__': так вы весь скрипт не запускается, если/когда вы делаете его импортировать. Окончательная версия будет выглядеть так:

import os 
import urllib2 
from csv import DictReader 

def moo(DocIn, DocOut, WebAddy): 
    os.rename(DocIn, DocOut) 
    file(DocIn, "wb").write(urllib2.urlopen(WebAddy).read()) 
    hosts0 = open(DocIn,"r") 
    hosts1 = open(DocOut,"r") 
    lines1 = hosts0.readlines() 
    for i,lines2 in enumerate(hosts1): 
     if lines2 != lines1[i]: 
      print "line ", i, " in hosts1 is different \n" 
      print lines2 

def main(infodoc): 
    with open(infodoc,'r') as infile: 
     incsv = DictReader(infile) 
     for row in incsv: 
      print row['Publisher'] 
      DocIn = row['DocIn'] 
      DocOut = row['DocOut'] 
      WebAddy = row['WebAddy'] 
      moo(DocIn, DocOut, WebAddy) 

if __name__ == '__main__': 
    main('Infodoc 2.txt') 
+0

Я действительно не понимаю, что случилось с вашим последним примером. Другие работают нормально. Каждый раз, когда я впервые вношу новый документ, т.е. DocIn, я получаю IndexError: индекс индекса вне диапазона, что является болью, если я добавлю в него больше одной новой строки. Я мог бы создать другой скрипт для создания новых документов и не проверять, но есть ли причина, по которой я получаю это? Много ли информации на странице? – Yeeons

+0

Это означает, что 'lines1' короче, чем 'hosts1'. – JaminSore

Смежные вопросы