2016-10-28 2 views
0

Was ich tun möchte: überspringen A1: A6, überspringen B1: B6 und speichern Sie den Rest auf CSV. Äquivalent möchte ich A7: B+ws.max_row zu csv speichern.Gibt es eine mehr pythische Möglichkeit, Zeilen in xlsx zu überspringen?

Mein Ansatz:

for sheet_name in wb.get_sheet_names(): 
    sheet = wb.get_sheet_by_name(sheet_name) 

    col1 = [] 
    cnt = 1 
    for i in sheet['A']: 
     if cnt <= 6: 
      cnt += 1 
      continue 
     col1.append(i.value) 

    col2 = [] 
    cnt = 1 
    for i in sheet['B']: 
     if cnt <= 6: 
      cnt += 1 
      continue 
     col2.append(i.value) 

    data = zip(col1, col2) 

    with open(str(sheet_name)+'.csv','wb') as out: 
     csv_out=csv.writer(out) 
     for row in data: 
      csv_out.writerow(row) 

Was ich über meinen Ansatz nicht mag: cnt und manuell wählen A dann B wählen (I genau die gleiche Anzahl von Zeilen für A überspringen wollen und B)

Meine Frage: Gibt es eine pythonische Art, Zeilen in xlsx zu überspringen?

+0

Konnte nicht 'zip (Blatt ['A'], Blatt [ 'B']) oder möglicherweise 'für Zeile in Blatt ['A: B']' (Ich kenne dieses Paket nicht, also ist das nur Vermutung meinerseits) –

+0

Ich habe versucht 'zip (Blatt ['A7 ':' the_max_row '], Blatt [' B7 ':' the_max_row ']) 'aber es gibt nur Tupel von Zellen zurück, aber es kann den Wert von Zellen nicht zurückgeben. –

+0

Wenn Sie ein Tupel von Zellen erhalten können, können Sie nicht mit den Zellen in jedem Tupel arbeiten? –

Antwort

2

openpyxl 2.4 eingeführt, um die iter_cols() Methode für Arbeitsblatt (NB. Es für Nur-Lese-Arbeitsblatt nicht verfügbar ist), so dass man einfach etwas tun kann, wie

cols = {1:[], 2:[]} 

for idx, col in enumerate(ws.iter_cols(min_col=1, max_col=2, min_row=6), start=1): 
    cols[idx] = [cell.value for cell in col] 

Hinweis, bitte nicht verwenden Sie wb.get_sheet_names() und wb.get_sheet_by_name() als Diese Methoden sind veraltet. Verwenden Sie stattdessen wb.sheetnames und wb[sheetname].

3

Für mich wäre es am einfachsten, einfach in der siebten Zeile zu beginnen und Reihe für Reihe zu iterieren, jede Zeile in die CSV-Datei schreiben, dann und dort, KEINE temporäre Kopie. Ich kenne OpenPyXL nicht sehr gut. Mit xlrd, Ihre gesamte Codebeispiel (alles, was Sie in Ihrer Frage enthalten) würde als

for sheet_name in wb.sheet_names(): 
    sheet = wb.sheet_by_name(sheet_name) 

    with open(sheet_name + '.csv', 'wb') as out: 
     csv_out = csv.writer(out) 
     for rx in range(6, sheet.nrows): 
      csv_out.writerow(sheet.row_values(rx, 0, 2)) 

(In der letzten Zeile ausgedrückt werden, können Sie die letzten beiden Argumente zu row_values() weglassen, wenn Ihre gesamte Zeile besteht aus nur die beiden Spalten. Diese letzten beiden Argumente wie der Start arbeiten und Indizes in einem Bereich oder Scheibe zu stoppen, mit dem Start inklusive und der Anschlag ist exklusive zu sein.)

Wenn Sie wirklich in einer temporären Kopie gespeichert Ihre Daten benötigen Mit xlrd können Sie bequem auf eine Zellenspalte gleichzeitig zugreifen:

data = zip(sheet.col_values(0, 6), sheet.col_values(1, 6)) 

Das erste Argument für col_values() ist der Spaltenindex und das zweite Argument ist der Startzeilenindex. (Wenn Sie vor dem Ende stoppen müssten, würden Sie ein drittes Argument für den Stoppzeilenindex angeben, wie ich es oben für row_values() getan habe.)

Verwandte Themen