如何改进我的追加和读取 excel For loop in python
How to improve my append and read excel For loop in python
希望你能帮助我。
我有一个文件夹,其中有几个结构相似的 .xlsx 文件(请注意,有些文件可能大于 50MB)。我想将它们组合在一起并(最终)将它们发送到数据库。但在此之前,我需要提高这段代码的性能,因为有时处理所有这些文件需要花费很多时间。
有问题的代码是这样的:
df_list = []
for file in location:
df_list.append(pd.read_excel(file, header=0, engine='openpyxl'))
df_concat = pd.concat(df_list)
有什么建议吗?
我在某处读到将 Excel 文件转换为 CSV 可能会提高性能,但我应该在附加文件之前还是在连接所有内容之后这样做?
考虑到 df_list 是一个列表,我可以进行转换吗?
如您所说,在 pandas 中读取 excel 个文件非常慢,您应该看看 。它基本上在 运行 python 脚本之前使用 vbscript 将 excel 文件转换为 csv 文件,这对于 python 脚本来说读取速度更快。
为了更具体地回答问题的第二部分,您应该先将 excel 文件转换为 csv,然后再使用 pandas 加载它们。 read_excel 函数是慢的部分。
我找到了 xlsx2csv 的解决方案
xlsx_path = './data/Extract/'
csv_path = './data/csv/'
list_of_xlsx = glob.glob(xlsx_path+'*.xlsx')
for xlsx in list_of_xlsx:
# Extract File Name on group 2 "(.+)"
filename = re.search(r'(.+[\|\/])(.+)(\.(xlsx))', xlsx).group(2)
# Setup the call for subprocess.call()
call = ["python", "./xlsx2csv.py", xlsx, csv_path+filename+'.csv']
try:
subprocess.call(call) # On Windows use shell=True
except:
print('Failed with {}'.format(filepath)
outputcsv = './data/bigcsv.csv' #specify filepath+filename of output csv
listofdataframes = []
for file in glob.glob(csv_path+'*.csv'):
df = pd.read_csv(file)
if df.shape[1] == 24: # make sure 24 columns
listofdataframes.append(df)
else:
print('{} has {} columns - skipping'.format(file,df.shape[1]))
bigdataframe = pd.concat(listofdataframes).reset_index(drop=True)
bigdataframe.to_csv(outputcsv,index=False)
我试图让这个对我有用,但没有成功。也许你可以让它为你工作?或者有没有人有什么想法?
希望你能帮助我。
我有一个文件夹,其中有几个结构相似的 .xlsx 文件(请注意,有些文件可能大于 50MB)。我想将它们组合在一起并(最终)将它们发送到数据库。但在此之前,我需要提高这段代码的性能,因为有时处理所有这些文件需要花费很多时间。
有问题的代码是这样的:
df_list = []
for file in location:
df_list.append(pd.read_excel(file, header=0, engine='openpyxl'))
df_concat = pd.concat(df_list)
有什么建议吗?
我在某处读到将 Excel 文件转换为 CSV 可能会提高性能,但我应该在附加文件之前还是在连接所有内容之后这样做? 考虑到 df_list 是一个列表,我可以进行转换吗?
如您所说,在 pandas 中读取 excel 个文件非常慢,您应该看看
为了更具体地回答问题的第二部分,您应该先将 excel 文件转换为 csv,然后再使用 pandas 加载它们。 read_excel 函数是慢的部分。
我找到了 xlsx2csv 的解决方案
xlsx_path = './data/Extract/'
csv_path = './data/csv/'
list_of_xlsx = glob.glob(xlsx_path+'*.xlsx')
for xlsx in list_of_xlsx:
# Extract File Name on group 2 "(.+)"
filename = re.search(r'(.+[\|\/])(.+)(\.(xlsx))', xlsx).group(2)
# Setup the call for subprocess.call()
call = ["python", "./xlsx2csv.py", xlsx, csv_path+filename+'.csv']
try:
subprocess.call(call) # On Windows use shell=True
except:
print('Failed with {}'.format(filepath)
outputcsv = './data/bigcsv.csv' #specify filepath+filename of output csv
listofdataframes = []
for file in glob.glob(csv_path+'*.csv'):
df = pd.read_csv(file)
if df.shape[1] == 24: # make sure 24 columns
listofdataframes.append(df)
else:
print('{} has {} columns - skipping'.format(file,df.shape[1]))
bigdataframe = pd.concat(listofdataframes).reset_index(drop=True)
bigdataframe.to_csv(outputcsv,index=False)
我试图让这个对我有用,但没有成功。也许你可以让它为你工作?或者有没有人有什么想法?