Как мне динамически выбрать CSV из строки его имени? - PullRequest
0 голосов
/ 22 сентября 2019

Я хочу вытащить CSV-файл, который загружен в мою папку загрузок, в фрейм данных pandas.Каждый раз, когда он загружается, он добавляет число в конец строки, так как имя файла уже находится в папке.Например, «Transactions (44) .csv» находится в папке, при следующей загрузке этот файл называется «транзакции (45) .csv».

Я заглянул в библиотеку glob илииспользуя библиотеку os, чтобы открыть самый последний файл в моей папке загрузок.Я не смог найти решение.Я думаю, мне нужен какой-то способ подключения к пути загрузки, найти все типы файлов csv, в которых есть строка «транзакции», и взять тот, у которого максимальное число в строке полного имени файла.

list(csv.reader(open(path + '/transactions (45).csv'))

Я надеюсь на что-то подобное path + '/%transactions%' + 'max()' + '.csv' Я знаю, что окончательный ответ будет совершенно другим, но я надеюсь, что это имеет смысл.

Ответы [ 2 ]

1 голос
/ 22 сентября 2019

Один из вариантов - использовать регулярные выражения для извлечения наибольшего числового идентификатора файла, а затем создать новое имя файла:

import re
import glob 
last_id = max(int(re.findall(r" \(([0-9]+)\).csv", x)[0]) \
              for x in glob.glob("transactions*.csv"))
name = f'transactions ({last_id}).csv'

В качестве альтернативы найдите самый новый файл напрямую по времени его модификации

Обратите внимание, что вам не следует использовать CSV-ридер для чтения CSV-файлов в Pandas.Вместо этого используйте pd.read_csv().

0 голосов
/ 22 сентября 2019

Предполагая формат "transactions (number).csv", попробуйте ниже:

import os
import numpy as np

files=os.listdir('Downloads/')
tranfiles=[f for f in files if 'transactions' in f]

Теперь ваш целевой файл выглядит следующим образом:

target_file=tranfiles[np.argmax([int(t.split('(')[1].split(')')[0]) for t in tranfiles])]

Считайте нужный файл, как показано ниже:

df=pd.read_csv('Downloads/'+target_file)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...