Проблема связана с тем, где вы указываете 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')
Я действительно не понимаю, что случилось с вашим последним примером. Другие работают нормально. Каждый раз, когда я впервые вношу новый документ, т.е. DocIn, я получаю IndexError: индекс индекса вне диапазона, что является болью, если я добавлю в него больше одной новой строки. Я мог бы создать другой скрипт для создания новых документов и не проверять, но есть ли причина, по которой я получаю это? Много ли информации на странице? – Yeeons
Это означает, что 'lines1' короче, чем 'hosts1'. – JaminSore