#python #file
#python #файл
Вопрос:
У меня есть несколько zip-файлов в папке. У меня есть скрипт для их обработки. Данные, которые должны быть записаны в базу данных, находятся в другом файле, и его структура выглядит следующим образом:
some_text;database;file_name
some_text2;database2;file_name2
....
Каков наилучший способ обработки этого файла? Также должно быть сообщено сообщение об ошибке, если в этом файле нет совпадающего имени zip-файла.
Мой текущий код:
filelist = glob.glob(os.path.join(rootdir, '*.zip'))
if filelist:
for file in filelist:
print "Working on file ", file
#get only file name without .zip for compare
aa = file.split(sl)
bb = aa[len(aa) -1]
cc = bb.split(".")
ime_sole = cc[0]
fle = codecs.open(rootdir sl 'portal_schools.txt',
'r',encoding="cp1250")
line = fle.readline()
# Read lines
for line in iter(fle):
#print line,
a,b,c = line.split(";")
if c == ime_sole:
print c
database = str(b)
#distdir = str(c)
else:
print "some text"
return
fle.close()
Но это не удается, потому что оно читается построчно. Если в первой строке нет совпадения, код останавливается. Мне нужно, чтобы это продолжалось через файл, а затем, после того, как все будет сделано, начните с нового zip-файла.
Комментарии:
1. Если вы улучшите форматирование, у вас будет больше шансов получить ответ.
2. Удалите возврат из условия else. Из-за этого код останавливается.
3. Извините, но с вашим кодом много проблем: вам не нужен этот «if filelist:», поскольку вы просто повторяете список, что будет нормально, если список пуст. Вы также должны использовать os.path.splitext() для получения имени файла. Вы должны прочитать свой файл данных из цикла обработки файлов и т. Д. И т. Д.
Ответ №1:
Я знаю, что мой код далек от совершенства. Проблема заключалась в else
. Я переместил его в конец всего кода. Это была ошибка новичка. Я также вставил try-catch, чтобы в случае сбоя в одном zip-файле следующий все еще обрабатывался. Теперь это выглядит примерно так:
filelist = glob.glob(os.path.join(rootdir, '*.zip'))
if filelist:
for file in filelist:
try:
aa = file.split(sl)
#print "aa ",aa
bb = aa[len(aa) -1]
#print "bb ", bb
cc = bb.split(".")
#print "cc ", cc
ime_sole = cc[0]
#print "imesole ", ime_sole
fle = codecs.open(rootdir sl 'portal_schools.txt','r',encoding="cp1250")
#line = fle.readline()
data = []
for line in iter(fle):
line = line.replace("rn", "")
x = line.split(";")
data.append(x)
result = [element for element in data if element[2] == ime_sole]
fle.close()
#print result
if result:
database = result[0][1]
vnos_data = "Podatki za %s , se vpisujejo v bazo %s " % (ime_sole, database)
host ="####"
user="####"
password = "####"
iUrnik_tables = iUrnik_tables_fromzip.Tables(defdir,file,sl,host,database,user,password)
id_skripte =iUrnik_tables[0]
date_begin = iUrnik_tables[1]
date_end = iUrnik_tables[2]
iUrnik_all_fromzip.FileWork(defdir,file,sl,host,database,user,password)
iUrnik_itt_zip.Proces(defdir,file,sl,host,database,user,password,id_skripte,date_begin,date_end)
trenutek = datetime.datetime.now()
trenutek = trenutek.strftime("%Y%m%d%H%M")
newfilename = os.path.splitext(file)[0]
newfilename = newfilename "_" str(trenutek) os.path.splitext(file)[1]
folder = defdir sl ime_sole sl "archive"
destination = folder sl
novoimezipa= destination newfilename.split(sl)[-1]
if not os.path.exists(folder):
os.makedirs(folder)
os.chdir(folder)
shutil.copy(file,destination)
old = destination file.split(sl)[-1]
os.rename(old , novoimezipa )
os.remove(file)
else:
nothing :)
#return
except:
print sys.exc_info()
else:
vnos_nodata= u"V mapi %s ni podatkov za prenos" % (rootdir)
Logging(defdir, sl, vnos_nodata)
Я знаю, что это не идеально, но это работает 🙂
Комментарии:
1. Поздравляю с решением. Когда вы сможете, пожалуйста, отметьте свой ответ как «принятый», чтобы другие могли извлечь уроки из вашего успеха. Приветствия ~