2017-12-23 5 views
0

Ich habe folgende CSV:Lesen Sie zwei Spalten von Variablen aus CSV, machen Sie etwas zu beiden auf einmal?

AD_NAME,PTL_NAME 
AdminsG,TEST_1 
SVC ACCTSG,TEST_2 
SQL AdminsG,TEST_3 

Zur Vereinfachung der das? willen, lassen Sie sich sagen, ich versuche in Spalte 0, um einen neuen Ordner für jede Zeile zu machen und in jedem Ordner eine Textdatei basierend auf Spalte 1 in der gleichen Zeile:

AdminsG 
     ->TEST_1.txt 
SVC ACCTSG 
     ->TEST_2.txt 
SQL AdminsG 
     ->TEST_3.txt 

jedoch

f = csv.reader(open('GROUP_NAMES.csv', 'r'), delimiter=',') 
next(f) 
col = list(zip(*f))[0] 
for row in col: 
    os.makedirs(row) 
    col2 = list(zip(*f))[1] 
    for row in col2: 
     #...code to write txt files... 

kehrt mit

IndexError: list index out of range 


f = csv.reader(open('GROUP_NAMES.csv', 'r'), delimiter=',') 
next(f) 
col = list(zip(*f))[0] 
for row in col: 
    os.makedirs(row) 

erstellt die drei Stammordner ganz gut, so dass ich glaube, ich bin fehlt das Boot auf, wo in der zweiten Spalte Variable in der gleichen Iteration der Schleife stopfen.

Antwort

1

Ich denke, Sie sind vorbei das Problem hier zu verkomplizieren.

Hier ist eine schnelle Lösung, die ich schrieb oben:

f = csv.reader(open('GROUP_NAMES.csv', 'r'), delimiter=',') 
headers = [] 
for row in f: 
    if not headers: 
     headers = row 
     continue 
    path = os.sep.join(row) 
    os.makedirs(path) 

Diese Lösung iteriert über alle Zeilen (Überspringen der Kopfzeile) ein Verzeichnis für die erste Spalte zu machen und innerhalb dieses Verzeichnisses ein anderes Verzeichnis zu machen für die zweite Spalte.

Der Grund, warum Ihre Lösung nicht funktionierte, war, dass Sie list(zip(*f)) zweimal aufgerufen haben. Die erste Ausführung führte dazu, dass das Datei-Handle vollständig durchlaufen wurde. Die zweite Ausführung führte zu einer leeren Liste.

+0

vielleicht habe ich meine Demo zu einfach. Nehmen wir an, ich benutze die zweite Spalte von Variablen, um etwas völlig anderes zu machen, wie zum Beispiel eine Textdatei mit dem Wert in Spalte [1] --- gleiche Zeile ... oder noch komplizierter, schälen Kartoffeln oder etwas. Ihr Codebeispiel funktioniert/help, FYI. Ich habe das OP bearbeitet. – tpcolson

0

Yay für Arrays. Nicht das "Pythonic", sondern das, was ich wollte.

try: 
    with open('GROUP_NAMES.csv','r') as file: 
     f = csv.reader(file, 
          delimiter = ',', 
          quotechar = '"') 
     next(f) 
     row = [row for row in f] 
     for i in row: 
      os.makedirs(i[0]) 
      file = open(i[0]+'\\'+i[1]+'.txt', 'w') 


except: 

    f.close() 
    raise 
+0

Sie benötigen dieses Zeilenarray nicht. Sie können die verbleibenden Zeilen der Datei direkt durchlaufen –

2

Sieht aus wie das Problem ist, dass die Liste nur einen Index mit einer Gruppe von Sollwerten wie hat:

[('AdminsG', 'SVC ACCTSG', 'SQL AdminsG'), ('TEST_1', 'TEST_2', 'TEST_3')] 

so, wenn Sie versuchen, diese Linie zu excute, es versuchen zu finden Index 1, die doesn Ich existiere nicht.

col2 = list(zip(*f))[1] 

möchten Sie vielleicht, dies ändern:

f = csv.reader(open('temp.csv', 'r'), delimiter=',') 
next(f) 
data = list(zip(*f)) 
row, col = data[0], data[1] 
data = (zip(row, col)) 
for col1, col2 in data: 
    os.mkdirs(os.path.join(col1, col2)) 

Es gibt eine weitere Alternative den gleichen Code zu schreiben:

import os 
import csv 

with open('GROUP_NAMES.csv', 'r') as csvReader: 
    csv_obj = csv.reader(csvReader) 
    for col1, col2 in csv_obj: 
     if col1 == 'AD_NAME' and col2 == 'PTL_NAME': 
      continue 
     os.mkdirs(os.path.join(col1, col2)) 
Verwandte Themen