python 生成器一次解析一个文件
python generator parsing one file at a time
我经常有一个包含一堆 csv 文件或 excel 或 html 等的文件夹。
我厌倦了总是写一个循环遍历文件夹中的文件,然后用适当的库打开它们,所以我希望我可以构建一个生成器,一次生成一个文件,该文件已经用适当的库打开图书馆。
这是我一直希望做的事情:
def __get_filename__(file):
lst = str(file).split('\')[-1].split('/')[-1].split('.')
filename, filetype = lst[-2], lst[-1]
return filename, filetype
def file_iterator(file_path, parser=None, sep=None, encoding='utf8'):
import pathlib as pl
if parser == 'BeautifulSoup':
from bs4 import BeautifulSoup
elif parser == 'pandas':
import pandas as pd
for file in pl.Path(file_path):
if file.is_file():
filename, filetype = __get_filename__(file)
if filetype == 'csv' and parser == 'pandas':
yield pd.read_csv(file, sep=sep)
elif filetype == 'excel' and parser == 'pandas':
yield pd.read_excel(file, engine='openpyxl')
elif filetype == 'xml' and parser == 'BeautifulSoup':
with open(file, encoding=encoding, errors='ignore') as xml:
yield BeautifulSoup(xml, 'lxml')
elif parser == None:
print(filename, filetype)
yield file
但我的希望和梦想破灭了:P 如果我这样做:
for file in file_iterator(r'C:\Users\hwx756\Desktop\tmp/'):
print(file)
这会引发错误 TypeError: 'WindowsPath' object is not iterable
我相信一定有办法以某种方式做到这一点,我希望有人比我聪明得多:)
谢谢!
如错误所述 'WindowsPath' object is not iterable
,您的行 for file in pl.Path('...'):
导致错误,因为您正在尝试迭代它。我之前没有使用过 pathlib
库,但是通过查看文档,如果你这样做 for file in pl.Path('...').iterdir():
那应该允许你以你似乎正在尝试的方式遍历你的目录。
所以这就是我认为你应该做的。
通过此获取文件夹中所有文件的名称
from os import listdir
from os.path import isfile, join
onlyfiles = [f for f in listdir(folder_path) if isfile(join(folder_path, f))]
使该路径成为绝对路径并使用该绝对路径读取 pandas
中的文件
该文件也有拼写错误
yield pd.read_excel(path, engine='openpyxl')
没有路径
我经常有一个包含一堆 csv 文件或 excel 或 html 等的文件夹。 我厌倦了总是写一个循环遍历文件夹中的文件,然后用适当的库打开它们,所以我希望我可以构建一个生成器,一次生成一个文件,该文件已经用适当的库打开图书馆。 这是我一直希望做的事情:
def __get_filename__(file):
lst = str(file).split('\')[-1].split('/')[-1].split('.')
filename, filetype = lst[-2], lst[-1]
return filename, filetype
def file_iterator(file_path, parser=None, sep=None, encoding='utf8'):
import pathlib as pl
if parser == 'BeautifulSoup':
from bs4 import BeautifulSoup
elif parser == 'pandas':
import pandas as pd
for file in pl.Path(file_path):
if file.is_file():
filename, filetype = __get_filename__(file)
if filetype == 'csv' and parser == 'pandas':
yield pd.read_csv(file, sep=sep)
elif filetype == 'excel' and parser == 'pandas':
yield pd.read_excel(file, engine='openpyxl')
elif filetype == 'xml' and parser == 'BeautifulSoup':
with open(file, encoding=encoding, errors='ignore') as xml:
yield BeautifulSoup(xml, 'lxml')
elif parser == None:
print(filename, filetype)
yield file
但我的希望和梦想破灭了:P 如果我这样做:
for file in file_iterator(r'C:\Users\hwx756\Desktop\tmp/'):
print(file)
这会引发错误 TypeError: 'WindowsPath' object is not iterable
我相信一定有办法以某种方式做到这一点,我希望有人比我聪明得多:) 谢谢!
如错误所述 'WindowsPath' object is not iterable
,您的行 for file in pl.Path('...'):
导致错误,因为您正在尝试迭代它。我之前没有使用过 pathlib
库,但是通过查看文档,如果你这样做 for file in pl.Path('...').iterdir():
那应该允许你以你似乎正在尝试的方式遍历你的目录。
所以这就是我认为你应该做的。 通过此获取文件夹中所有文件的名称
from os import listdir
from os.path import isfile, join
onlyfiles = [f for f in listdir(folder_path) if isfile(join(folder_path, f))]
使该路径成为绝对路径并使用该绝对路径读取 pandas
中的文件该文件也有拼写错误
yield pd.read_excel(path, engine='openpyxl')
没有路径