как захватить только определенные типы файлов в каталоге, используя glob - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь использовать «глобус» python для захвата различных файлов, используя подстановочный знак, а НЕ путь, по которому эти файлы пришли.

В этой ситуации я пытаюсь перехватить все файлы, которые начинаются с имени file_ в каталоге. Хотя в будущем могут возникнуть ситуации, когда мне нужно будет извлекать файлы из файлов с расширениями файлов (i.e. all .csv and .log) из каталога.

Я использую приведенную ниже строку python, которая может захватить только полный путь вместе с намеченным файлом. Я только хочу "потереть" сам файл, а НЕ ПУТЬ

import os
import glob
import boto3
from botocore.client import Config

ACCESS_KEY_ID = 'some_key'
ACCESS_SECRET_KEY = 'some_key'
BUCKET_NAME = 'some_bucket'


s3 = boto3.client(
    's3',
    aws_access_key_id=ACCESS_KEY_ID,
    aws_secret_access_key=ACCESS_SECRET_KEY,
    config=Config(signature_version='s3v4')
)

csv_files = glob.glob('/home/user/folder1/folder2/*.csv')
#json_files = glob.glob("/home/user/folder1/h_log_*.json")

for filename in csv_files:
     print("Putting %s" % filename)
     s3.upload_file(filename, BUCKET_NAME, 'new_folder' + '/' + filename)

#for filename in json_files:
#    print("Putting %s" % filename)
#    s3.upload_file(filename, BUCKET_NAME, filename)

print("All_Finished")

####################################################
####################################################

The string I am trying to concentrate on updating from the script preferably is below:

csv_files = glob.glob('/home/user/folder1/folder2/*.csv')


An example of a file directory containing various files and file types :

Below need to grab all files that end in `.csv`
/home/user/Desktop/folder_example/
file_1.csv
file_1.csv
file_1.csv
file_1.csv

Below need to grab all files that start with `file_`
/home/user/Desktop/folder_example/
file_2.log
file_2.csv
file_2.log
file_2.csv

Ответы [ 3 ]

0 голосов
/ 04 октября 2019

Вы можете разделить вывод glob на основе разделителя '/' или '\', а затем сохранить последнюю часть.

import os
target_path = r"/home/user/folder1/folder2"
fpaths = glob.glob(target_path+os.sep+'*.csv')
[fp.split(os.sep)[-1] for fp in fpaths]

Полный пример

Создание демонстрационной папки и демонстрационных файлов

import glob, os

# Make Demo Files and a Demo Folder
target_path = os.path.join(os.getcwd(), 'temp_dump')
if not os.path.exists(target_path):
    os.makedirs(target_path)
print(os.listdir(os.getcwd()))

file_names = ['file_{}.{}'.format(fnum, fext) for fnum in range(5) for fext in ['csv', 'txt', 'log']]

for file_name in file_names:
    fpath = os.path.join(target_path, file_name)
    with open(fpath, 'w') as f:
        f.write(file_name)

print(sorted(os.listdir(target_path)))

Вывод :

['file_0.csv', 'file_0.log', 'file_0.txt', 
'file_1.csv', 'file_1.log', 'file_1.txt', 
'file_2.csv', 'file_2.log', 'file_2.txt', 
'file_3.csv', 'file_3.log', 'file_3.txt', 
'file_4.csv', 'file_4.log', 'file_4.txt']

ПолучитьИмена файлов .csv файлов (без пути, просто имя)

fpaths = glob.glob(target_path+os.sep+'*.csv')
[fp.split(os.sep)[-1] for fp in fpaths]

Вывод

['file_0.csv', 'file_3.csv', 'file_2.csv', 'file_1.csv', 'file_4.csv']
0 голосов
/ 04 октября 2019

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

csv_files = glob.glob( os.path.join('/home/user/Desktop/folder_example/', '*.csv') )
log_files = glob.glob( os.path.join('/home/user/Desktop/folder_example/', '*.log') )
0 голосов
/ 04 октября 2019

Как насчет использования os.path.basename?

Вы можете комбинировать glob с этой функцией, чтобы получить то, что вы хотите:

[os.path.basename(item) for item in glob.glob("/home/user/folder1/folder2/*.csv")]

...