2013-10-04 235 views
0

我有一个python的csv阅读器的问题。问题是我想打开并阅读不同的csv文件,但他总是读同一个文件。Python的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,但他应该firt开放EDILIZIA。 csv,编译EDILIZIA.xml,然后阅读EDILE-ARCHIT.csv并编译EDILE-ARCHIT.xml。

如果你看看最后个XML,你会看到EDILE-ARCHIT.xml将只显示EDILIZIA.csv和EDILE-ARCHIT.csv的共同科目

+1

我们需要看到实际从CSV文件读取的代码,而不仅仅是打开文件的代码。但是,有人猜测,我怀疑你的缩进是错误的,代码并没有按照你的想法进行。 –

+0

外'for'行不应缩进。 – Milo

+0

第二个'nome_corso_file'行覆盖之前分配的值。没有意义。 – Milo

回答

0

我想我可能有发现你的问题的原因。

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

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

+0

试图从.csv文件和列表中的项目中删除句号,但没有任何更改。 – wan

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) 

干杯。

+0

谢谢您的建议和时间,但它仍然无法正常工作。似乎存在一些问题,因为有些事情发生了变化,但方式不正确。不管怎样,谢谢你。 我会尝试使用Python的XML模块。 – wan