Моя ошибка связана с проблемой абсолютного пути? - PullRequest
2 голосов
/ 03 апреля 2020

Я пытаюсь создать переменную, которая хранит папку в каталоге, в котором я работаю, под названием TimeSeries. После этого я пытаюсь прочитать каждый файл в TimeSeries. Очевидно, моя ошибка связана с тем, что df = pd.read_csv(f) является относительным путем, а не абсолютным. Однако я не могу подтвердить это, так как, когда я проверяю isabs(direct), я возвращаю True. Я знаю, что ошибка связана с этой конкретной c строкой, я просто не знаю, что это.

Код:

import pandas as pd
import numpy as np
import os

direct = os.path.abspath('TimeSeries')


for f in direct:
    df = pd.read_csv(f)
    df = df.replace(np.nan, 'Other', regex=True)
    if df.columns[0] == ['FIPS']:
        print(df.columns)
        df = df.drop(['FIPS', 'Last_Update', 'Lat', 'Long_'], axis=1)
        df = df.rename(columns={'Admin2': 'County',
                                'Province_State': 'State',
                                'Country_Region': 'Country',
                                'Combined_Key': 'City'})
        df.to_csv(f)
    elif df.columns[0] == ['Province/State']:
        print(df.columns)
        df = df.drop(['Last Update'], axis=1)
        df = df.rename(columns={'Province/State': 'State',
                                'Country/Region': 'Country'})
        df.to_csv(f)
    else:
        pass

Результат:

Traceback (most recent call last):
  File "C:/Users/USER/PycharmProjects/Corona Stats/Corona.py", line 9, in <module>
    df = pd.read_csv(f)
  File "C:\Users\USER\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\io\parsers.py", line 676, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "C:\Users\USER\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\io\parsers.py", line 448, in _read
    parser = TextFileReader(fp_or_buf, **kwds)
  File "C:\Users\USER\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\io\parsers.py", line 880, in __init__
    self._make_engine(self.engine)
  File "C:\Users\USER\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\io\parsers.py", line 1114, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "C:\Users\USER\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\io\parsers.py", line 1891, in __init__
    self._reader = parsers.TextReader(src, **kwds)
  File "pandas\_libs\parsers.pyx", line 374, in pandas._libs.parsers.TextReader.__cinit__
  File "pandas\_libs\parsers.pyx", line 674, in pandas._libs.parsers.TextReader._setup_parser_source
FileNotFoundError: [Errno 2] File C does not exist: 'C'

Process finished with exit code 1

Вот что происходит, когда я печатаю напрямую.

C:\Users\USER\PycharmProjects\Corona Stats\TimeSeries

Ответы [ 3 ]

1 голос
/ 03 апреля 2020

IIU C: Попробуйте:

source = "C:/Users/USER/PycharmProjects/Corona Stats/TimeSeries"
for filename in os.listdir(source):
    filepath = os.path.join(source, filename)
    if not os.path.isfile(filepath):
        continue

    df = pd.read_csv(filepath)
    df = df.replace(np.nan, 'Other', regex=True)
    if df.columns[0] == 'FIPS':
        print(df.columns)
        df = df.drop(['FIPS', 'Last_Update', 'Lat', 'Long_'], axis=1)
        df = df.rename(columns={'Admin2': 'County',
                                'Province_State': 'State',
                                'Country_Region': 'Country',
                                'Combined_Key': 'City'})
        df.to_csv(filepath)
    elif df.columns[0] == 'Province/State':
        print(df.columns)
        df = df.drop(['Last Update'], axis=1)
        df = df.rename(columns={'Province/State': 'State',
                                'Country/Region': 'Country'})
        df.to_csv(filepath)
1 голос
/ 03 апреля 2020

При использовании python или pandas при использовании read_csv или pd.read_csv они оба смотрят в текущий рабочий каталог, по умолчанию там, где начался процесс python. Поэтому вам нужно использовать модуль os для chdir () и взять его оттуда.

import pandas as pd 
import os
print(os.getcwd())
os.chdir("<PATH TO DIRECTORY>")
print(os.getcwd())
df = pd.read_csv('<The Filename You want to read>')
print(df.head())
0 голосов
/ 03 апреля 2020

Здесь вы перебираете EACH букву в пути:

direct = 'C:/Users/USER/PycharmProjects/Corona Stats/TimeSeries'

for f in direct:
    ...

Если вы хотите получить файлы в каталоге, вы должны использовать что-то вроде:

for item in os.listdir(direct):
    ...

Лично я бы использовал pathlib:

from pathlib import Path

direct = Path('C:/Users/USER/PycharmProjects/Corona Stats/TimeSeries')

for item in direct.glob('*'):
    ...
...