Python, перебирающий папки и их подпапки для чтения CSV, получает имена файлов, но при read_csv возвращает file not found

#python #pandas

#python #pandas

Вопрос:

Я пытаюсь перебирать папки и подпапки для доступа и чтения файлов CSV, прежде чем преобразовывать их в JSON. Вот код, над которым я работаю:

 cursor = conn.cursor()
try:
    # Specify the folder containing needed files
    folderPath = 'C:\Users\myUser\Desktop\toUpload' # Or using input()
    fwdPath = 'C:/Users/myUser/Desktop/toUpload'
    for countries in os.listdir(folderPath):
        for sectors in os.listdir(folderPath '\' countries):
            for file in os.listdir(folderPath '\' countries '\' sectors):
                data = pd.DataFrame()
                filename, _ext = os.path.splitext(os.path.basename(folderPath '\' countries '\' file))
                print(file   ' '   filename  ' '   sectors   ' '   countries)
                data = pd.read_csv(file)
    # cursor.execute('SELECT * FROM SECTORS')
    # print(list(cursor))
finally:
    cursor.close()
conn.close()
 

Следующая строка печати возвращает файл с именем файла без расширения, а затем имена папок секторов и стран:

 print(file   ' '   filename  ' '   sectors   ' '   countries)
 

myfile.csv myfile WASHSector CTRYIrq

Теперь, когда дело доходит до чтения CSV, это займет много-много времени, и в конце O выдает следующую ошибку:

[Ошибка 2] Файл myfile.csv не существует

Ответ №1:

вам нужно указать pd.read_csv полный путь к файлу, поэтому измените его на:

 data = pd.read_csv(folderPath '\' countries '\' sectors   '\'  file)
 

Ответ №2:

Перед чтением файла csv вы должны составить полный путь к файлу, иначе pandas не сможет прочитать этот файл.

 import os

# ...
path = os.path.join(folderPath, countries, sectors, file)
data = pd.read_csv(path)
 

Также вместо использования трех вложенных циклов for я рекомендую вам использовать этот os.walk метод. Он будет автоматически повторяться по каталогам

 >>> folderPath = 'C:\Users\myUser\Desktop\toUpload'
>>> for root, _, files in os.walk(folderPath):
>>> ...   for f in files:
>>> ...     pd.read_csv(os.path.join(root, f))
 

Комментарии:

1. Извините, это локальный каталог с именем ai . Я редактирую ответ прямо сейчас

2. Основная причина, по которой я это делаю, заключается в том, что мне нужно имя каждой вложенной папки для добавления в файл позже

3. поэтому мне нужно знать, что этот файл находится в папке IRQ и подпапке WASH, чтобы добавить их в базу данных. Может os.walk() помочь и с этим.

4. Ну, у вас есть имя subdir в корневой переменной. Это всего лишь рекомендация для повышения производительности, если вам неудобно ее использовать, не используйте ее 🙂

5. Я заинтересован в повышении производительности, поскольку для просмотра будут сотни и сотни папок.