2013-10-04 2 views
0

У меня проблема с читателем csv python. Проблема в том, что я хочу открывать и читать разные файлы csv, но он постоянно читает то же самое.Читатель csv Python продолжает читать тот же файл

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.

Если вы посмотрите на заключительных XMLs, вы увидите, что 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. Ваш код хочет объединить первые три анно с текущим corso. Чтобы исправить это, вы должны внести два изменения.

Первый в этом заголовке for петли:

for corso in corsi: 

Изменить на:

for num, corso in enumerate(corsi): 

И когда вы назначаете lez:

lez = orario[i + a*12][j] 

Modify для:

lez = orario[i + a*12*(num+1)][j] 

Теперь это должно сработать.

Этот код дает точно такой же результат, но он использует модуль XML Python для создания выходного файла:

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

Благодарим вас за советы и на время, но это все еще не работает. Кажется, что есть некоторые проблемы, потому что что-то изменилось, но не в правильном направлении. В любом случае, спасибо. Я попытаюсь использовать XML-модуль Python. – wan

Смежные вопросы