我有一个文件夹,其中包括大约400个txt文件。txt文件的MAx大小为2到2.5mb。
我试图用python代码将这些文件转换为csv。当txt的大小很小(甚至超过500个文件)时,我的代码可以很好地工作,并且可以快速地将txt转换为csv,但是当文件大小很少时,则需要相当长的时间。
很明显,大量数据需要很长时间才能完成,但问题是,从2天以来,我一直在运行这个转换过程,甚至没有完成50%的转换过程。
有没有想法将这些txt文件快速转换为csv??我是说几个小时。如果需要超过2天,那么我将没有足够的时间来分析它。
我的密码在这里:
import glob
import os, os.path, glob
import numpy as np
import matplotlib.pyplot as plt
from natsort import natsorted
import pandas as pd
from matplotlib.patches import Ellipse
from matplotlib.text import OffsetFrom
from mpl_toolkits.mplot3d import Axes3D
from random import random
data_folder = "./all/"
data_folder
files = natsorted(glob.glob(data_folder + 'dump*.data'))
number_of_files = len(files)
#print(number_of_files)
#files
file_open = open("./all/dump80000.data", "r")
with open("./all/dump80000.data") as f:
lines = f.readlines()
#removing 'ITEM:'
s = 'ITEM: ATOMS '
lines[8] = lines[8].replace(s, '')
#getting the header names
headers = lines[8].split()
headers.append('TIMESTEP')
df = pd.DataFrame(columns=headers)
counter = 0
for total_files in range(number_of_files):
with open(files[total_files]) as f:
lines = f.readlines()
total_atoms = int(lines[3])
for i in range(total_atoms):
row_elements = lines[9+i].split()
row_elements.append(int(lines[1]))
df.loc[counter] = row_elements
counter=counter+1
df.to_csv(r'all.csv', index = False)知道吗?建议?
谢谢
以防万一,如果您需要txt示例:
https://raw.githubusercontent.com/Laudarisd/dump46000.data
或
https://raw.githubusercontent.com/Laudarisd/test/main/dump46000.data
发布于 2021-12-29 01:38:46
使用简单的readline怎么样?我怀疑readlines和/或pd.DataFrame花费了这么多时间。下面这句话对我来说似乎足够快了。
import glob
import time
start = time.time()
data_folder = "./all/"
files = glob.glob(data_folder + 'dump*.data')
# get header from one of the files
with open('all/dump46000.data', 'r') as f:
for _ in range(8):
next(f) # skip first 8 lines
header = ','.join(f.readline().split()[2:]) + '\n'
for file in files:
with open(file, 'r') as f, open(f'all.csv', 'a') as g: # note the 'a'
g.write(header) # write the header
for _ in range(9):
next(f) # skip first 9 lines
for line in f:
g.write(line.rstrip().replace(' ', ',') + '\n')
print(time.time() - start)
# id,type,x,y,z,vx,vy,vz,fx,fy,fz
# 201,1,0.00933075,-0.195667,1.53332,-0.000170702,-0.000265168,0.000185569,0.00852572,-0.00882728,-0.0344813
# 623,1,-0.101572,-0.159675,1.52102,-0.000125008,-0.000129469,6.1561e-05,0.0143586,-0.0020444,-0.0400259
# 851,1,-0.0654623,-0.176443,1.52014,-0.00017815,-0.000224676,0.000329338,0.0101743,0.00116504,-0.0344114
# 159,1,-0.0268728,-0.186269,1.51979,-0.000262947,-0.000386994,0.000254515,0.00961213,-0.00640215,-0.0397847发布于 2021-12-29 01:31:40
快速浏览一下您的代码,您似乎采用了以下方法来转换文件:
但是,如果您可以对代码进行一些小的调整:
基本上,采取一种迭代的方法,而不是一次性地读取整个文件。接下来,您可以使用异步使其更快,在这里您可以同时处理所有文件。
发布于 2021-12-29 01:32:27
在不知道你想从这些文件中提取什么数据的情况下,很难给出精确的帮助,但乍一看,你肯定应该使用熊猫内置的文件读取方法之一,这种方法可以保证比代码快很多倍。假设您希望跳过前9行,您可以这样做:
headers = ["a", "b", ...]
pd.read_csv(open("./all/dump80000.data"), skiprows=9, sep=" ", columns=headers)如果这还不够快,您可以并行化您的代码,因为大部分处理只是将数据加载到内存中。
https://stackoverflow.com/questions/70514234
复制相似问题