0

我在使用 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 文件。

http://pastebin.com/kJhL8HpK

如果您尝试使其先读取 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 的常见主题

4

2 回答 2

1

花了很长时间才弄清楚你在这里做什么。说实话,你的代码是一团糟——有许多未使用的变量和行根本没有意义。无论如何,您的代码每次都会读取适当的 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)

干杯。

于 2013-10-04T22:51:35.763 回答
0

我想我可能已经发现了您的问题的原因。

列表中的第二项以corsi句号结尾。这意味着您将寻找EDILE-ARCHIT..csv几乎不存在的文件“”。当您尝试打开文件时,open()调用将引发异常,您的程序将终止。

尝试删除尾随句号,然后再次运行。

于 2013-10-04T10:33:07.670 回答