[英]Python's csv reader keep reading the same file
我在使用python的csv閱讀器時遇到問題。 問題是我想打開並讀取不同的csv文件,但是他一直在讀取始終相同的文件。
from csv import reader
alphabet = ["a", "b", "c"]
for letter in alphabet:
csv_file = open('/home/desktop/csv/' + letter + '.csv', 'r')
csv_data = reader(csv_file)
問題是他似乎打開了其他文件,但是他始終讀取第一個文件。
有沒有一種方法可以“清理”讀者或讓他閱讀另一個文件? 我什至試圖關閉csv文件,但是沒有用。
完整的代碼是這個
from csv import reader
#Orario
orario_csv_file = '/home/andrea/Scrivania/orario.csv'
orario_csv = open(orario_csv_file)
orario_data = reader(orario_csv)
orario = []
#Corsi
corsi = ["EDILIZIA", "EDILE-ARCHIT", "ELETTRONICA", "TECNOLOGIE_DI_INTERNET", "INFORMATICA", "GESTIONALE", "ENERGETICA", "MECCANICA", "CIVILE_ED_AMBIENTALE", "MEDICA", "ENGINEERING_SCIENCES"]
giorni = ["Lun", "Mar", "Mer", "Gio", "Ven"]
for row in orario_data:
orario.append(row)
for corso in corsi:
nome_corso_file = '/home/andrea/Scrivania/xml/' + corso + '.xml'
nome_corso_xml = open(nome_corso_file, 'wt')
nome_corso_xml.write('<?xml version="1.0"?>' + "\n")
nome_corso_xml.write('<orario>' + "\n")
nome_csv = corso + '_csv'
nome_csv = '/home/andrea/Scrivania/csv/' + corso + '.csv'
nome_corso_csv = open(nome_csv, 'rt')
corso_data = reader(nome_corso_csv)
nome_corso_xml.write(' <corso name="' + corso + '">' + "\n")
for a in range(0, 3):
nome_corso_xml.write(' <anno num="' + str(a+1) + '">' + "\n")
for j in range(1, 6):
nome_corso_xml.write(' <giorno name="' + orario[2][j] + '">' + "\n")
for i in range(3, 12):
lez = orario[i + a*12][j]
if lez == "":
nome_corso_xml.write(' <lezione>' + "-" + '</lezione>' + "\n")
else:
for riga in corso_data:
if riga[0] == lez:
if riga[2] == "":
nome_corso_xml.write(' <lezione name="' + lez + '">' + riga[1] + '</lezione>' + "\n")
else:
for g in range(0, len(riga)):
if riga[g].lower() == orario[2][j].lower():
nome_corso_xml.write(' <lezione name="' + lez + '">' + riga[g+1] + '</lezione>' + "\n")
nome_corso_csv.seek(0)
nome_corso_xml.write(' </giorno>' + "\n")
nome_corso_xml.write(' </anno>' + "\n")
nome_corso_xml.write(' </corso>' + "\n")
nome_corso_xml.write('</orario>' + "\n")
nome_corso_xml.close()
他打開“ EDILIZIA.csv”並編譯“ EDILIZIA.xml”,然后應該打開“ EDILE-ARCHIT.csv”並編譯其xml,但是當他閱讀時,他繼續從“ EDILIZIA.csv”中讀取。
這是您需要的.csv文件。
如果您嘗試使其先讀取EDILIZIA.csv,然后再讀取EDILE-ARCHIT.csv,則他將繼續使用EDILIZIA.csv來編譯xml,但是他應該先打開EDILIZIA.csv,再編譯EDILIZIA.xml,然后閱讀EDILE-ARCHIT.csv並編譯EDILE-ARCHIT.xml。
如果看一下最終的xml,您將看到EDILE-ARCHIT.xml僅顯示EDILIZIA.csv和EDILE-ARCHIT.csv的共同主題。
花了很長時間弄清楚您在這里做什么。 說實話,您的代碼是一團糟-許多未使用的變量和行根本沒有任何意義。 無論如何,您的代碼每次都會讀取相應的csv文件,因此該錯誤不在您認為的位置。
如果我是對的,則orario.csv
包含每個課程的時間表(存儲在corsi
列表中)為三個學期或三年,而corso.csv文件包含課程舉行的房間。 因此,您希望將信息合並到XML文件中。
您只忘記了一件事:在orario.csv
繼續。 您的代碼希望將前三個anno與當前corso
合並。 要修復它,您必須進行兩項更改。
首先是這個for
循環頭文件:
for corso in corsi:
修改為:
for num, corso in enumerate(corsi):
當您分配lez
:
lez = orario[i + a*12][j]
修改為:
lez = orario[i + a*12*(num+1)][j]
現在應該可以了。
這段代碼產生的結果完全相同,但是它使用Python的XML模塊來構建輸出文件:
from csv import reader
import xml.etree.cElementTree as ET
import xml.dom.minidom as DOM
corsi = ["EDILIZIA", "EDILE-ARCHIT", "ELETTRONICA", "TECNOLOGIE_DI_INTERNET", "INFORMATICA", "GESTIONALE", "ENERGETICA", "MECCANICA", "CIVILE_ED_AMBIENTALE", "MEDICA", "ENGINEERING_SCIENCES"]
with open('orario.csv', 'r') as orario_csv:
orario = reader(orario_csv)
orario_data = [ row for row in orario ]
for num, corso in enumerate(corsi):
with open(corso + '.csv', 'r') as corso_csv:
corso_raw = reader(corso_csv)
corso_data = [ row for row in corso_raw ]
root_elem = ET.Element('orario')
corso_elem = ET.SubElement(root_elem, 'corso')
corso_elem.set('name', corso)
for anno in range(0, 3):
anno_elem = ET.SubElement(corso_elem, 'anno')
anno_elem.set('num', str(anno + 1))
for giorno in range(1, 6):
giorno_elem = ET.SubElement(anno_elem, 'giorno')
giorno_elem.set('name', orario_data[2][giorno])
for lezione in range(3, 12):
lez = orario_data[lezione + anno * 12 * (num + 1)][giorno]
if lez == '':
lezione_elem = ET.SubElement(giorno_elem, 'lezione')
lezione_elem.text = '-'
else:
for riga in corso_data:
if riga[0] == lez:
if riga[2] == '':
lezione_elem = ET.SubElement(giorno_elem, 'lezione')
lezione_elem.set('name', lez)
lezione_elem.text = riga[1]
else:
for g in range(0, len(riga)):
if riga[g].lower() == orario_data[2][giorno].lower():
lezione_elem = ET.SubElement(giorno_elem, 'lezione')
lezione_elem.set('name', lez)
lezione_elem.text = riga[g + 1]
with open(corso + '_new.xml', 'w') as corso_xml:
xml_data = DOM.parseString(ET.tostring(root_elem, method = 'xml')).toprettyxml(indent = ' ')
corso_xml.write(xml_data)
干杯。
我想我可能已經發現了您問題的原因。
您的corsi
列表中的第二項以corsi
結尾。 這意味着您將尋找幾乎不存在的文件“ EDILE-ARCHIT..csv
”。 當您嘗試打開文件時, open()
調用將引發異常,並且程序將終止。
嘗試刪除尾隨的句號,然后再次運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.