Mam pliki CSV, których nie mogę edytować za pomocą programu Excel. Chcę dokonać dynamicznego kodu, aby usunąć najlepsze wiersze (przed wierszem nagłówka) i ostatniego wiersza bez wprowadzania numerów wierszy. Kod używam teraz, to:

FIRST_ROW_NUM = 1  
ROWS_TO_DELETE = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 5421344}
with open('filename', 'r') as infile,open('filename', 'w') as outfile:
     outfile.writelines(row for row_num, row in enumerate(infile, FIRST_ROW_NUM)
                    if row_num not in ROWS_TO_DELETE)

Problem z tym kodem jest, aby ręcznie wprowadzić numer wierszy, aby je usunąć.

Kolejny problem, który mam, to liczba wierszy do usunięcia nie jest stała i zmienia z pliku do pliku.

Przykładowy CSV jest dołączony Tutaj

Chcę kodu, który może w jakiś sposób usunąć te wiersze bez żadnego wejścia z mojej strony.

Uwaga: Nie ma informacji o ostatnim rzędzie w CSV, ale jest to coś takiego:

Grand Total: - -  - - - - - - - - - - - - - - -  - - - -  - -  - - - 
0
PyNoob 25 czerwiec 2017, 17:17

4 odpowiedzi

Najlepsza odpowiedź

Można to zrobić za pomocą Pythona's Href = "https://docs.Python.org/2/library/csv.html#module-csv" rel="noFollow NefErrer"> csv biblioteka Aby pomóc w analizowaniu pliku, a użycie itertools dropwhile i {{ X2}} Funkcje, aby wybrać żądane wiersze:

import itertools    
import csv

with open('Test.csv', newline='') as f_input, open('output.csv', 'w', newline='') as f_output:
    csv_input = csv.reader(f_input)
    csv_output = csv.writer(f_output)

    # Skip over initial lines until the header row
    next(itertools.dropwhile(lambda x: x[0] != "Report Fields", csv_input))

    # Write rows until the total row is found
    csv_output.writerows(itertools.takewhile(lambda x: "Grand Total" not in x[0], csv_input))   

Odczytuje każdy wiersz pliku CSV, aż znajdzie wiersz z pierwszą kolumną zawierającą Report Fields. Następnie pomija ten rząd. Teraz pisze wszystkie pozostałe wiersze do pliku CSV wyjściowego, aż pierwszy wpis kolumny zawiera słowa Grand Total, a następnie zatrzymuje się.

0
Martin Evans 25 czerwiec 2017, 18:01
import pandas as pd
df = pd.read_csv('file_name.csv', skiprows=27)
df.drop(df.index[5421327]) #5421327 = 5421344-27

Możesz użyć modułu Pandasa i Read_CSV, aby to zrobić. Skiprows definiuje numery linii, aby pominąć (0-indeksowane) lub liczbę linii do pominięcia (int) na początku pliku. I na końcu Drop Col z indeksem 5421344.

To dla wartości statycznych. Dla dynamicznych, jeśli wiersze przed wierszy lub Nan możesz użyć tego:

import pandas as pd
df = read_csv('file_name', skiprows=1)
df.dropna(axis=0, inplace=True)
df.drop(df.iloc[-1])
0
CezarySzulc 25 czerwiec 2017, 15:41

Najpierw przeczytałem w całym pliku jako łańcuch i podzielił go, co wydaje się wskaźnikiem dla Dataframe, który próbujesz przeczytać 'Report Fields'. Następnie możesz wyeliminować ostatni wiersz, dzieląc się na Newlines i indeksowanie listy, aby uwzględnić wszystkie oprócz ostatniego z [:-1]

with open('infile.csv', 'r') as infile, open('outfile.csv', 'w') as outfile:
    txt = infile.read().split('Report Fields')[1]
    outfile.write('\n'.join(txt.split('\n')[1:-1]))
0
piRSquared 25 czerwiec 2017, 15:34

Otwórz pliki wejściowe i wyjściowe, a następnie:

for line in infile:
    if <line matches header row>:
        break
outfile.write(line)
for line in infile:
    if <line matches grand total line>:
        break
    outfile.write(line)
0
rd_nielsen 25 czerwiec 2017, 14:28