Ich versuche, ein Skript zu schreiben, das eine Datei importiert, dann etwas mit der Datei macht und das Ergebnis in eine andere Datei ausgibt.

df = pd.read_csv('somefile2018.csv')

Der obige Code funktioniert einwandfrei. Ich möchte jedoch vermeiden, den Dateinamen im Code fest zu codieren.

Das Skript wird in einem Ordner (Verzeichnis) ausgeführt, der die script.py und mehrere CSV-Dateien enthält.

Ich habe Folgendes versucht:

somefile_path = glob.glob('somefile*.csv')

df = pd.read_csv(somefile_path)

Aber ich bekomme folgenden Fehler:

ValueError: Invalid file path or buffer object type: <class 'list'>

7
Kvothe 18 Apr. 2018 im 14:36

4 Antworten

Beste Antwort

glob gibt eine Liste zurück, keine Zeichenfolge. Die Funktion read_csv verwendet eine Zeichenfolge als Eingabe, um die Datei zu finden. Versuche dies:

for f in glob('somefile*.csv'):
    df = pd.read_csv(f)
    ...
    # the rest of your script
10
James 18 Apr. 2018 im 11:43

Sie können die Liste der CSV-Dateien im Skript abrufen und diese durchlaufen.

from os import listdir
from os.path import isfile, join
mypath = os.getcwd()

csvfiles = [f for f in listdir(mypath) if isfile(join(mypath, f)) if '.csv' in f]

for f in csvfiles:
    pd.read_csv(f)
# the rest of your script
3
iDrwish 18 Apr. 2018 im 11:45

Verwenden Sie diese Funktion, um alle Dateien zu lesen, die einem bestimmten Muster folgen, sofern sie dasselbe Schema verwenden:

import glob
import pandas as pd

def pd_read_pattern(pattern):
    files = glob.glob(pattern)

    df = pd.DataFrame()
    for f in files:
        df = df.append(pd.read_csv(f))

    return df.reset_index(drop=True)

df = pd_read_pattern('somefile*.csv')

Dies funktioniert entweder mit einem absoluten oder einem relativen Pfad.

1
pleicht17 10 Dez. 2019 im 22:25

Durchlaufen Sie jede Datei, erstellen Sie eine Liste mit DataFrame und setzen Sie sie dann mit concat zusammen.

1
Boud 18 Apr. 2018 im 11:40