首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python文件转换需要超过2天。

Python文件转换需要超过2天。
EN

Stack Overflow用户
提问于 2021-12-29 01:23:45
回答 4查看 153关注 0票数 2

我有一个文件夹,其中包括大约400个txt文件。txt文件的MAx大小为2到2.5mb。

我试图用python代码将这些文件转换为csv。当txt的大小很小(甚至超过500个文件)时,我的代码可以很好地工作,并且可以快速地将txt转换为csv,但是当文件大小很少时,则需要相当长的时间。

很明显,大量数据需要很长时间才能完成,但问题是,从2天以来,我一直在运行这个转换过程,甚至没有完成50%的转换过程。

有没有想法将这些txt文件快速转换为csv??我是说几个小时。如果需要超过2天,那么我将没有足够的时间来分析它。

我的密码在这里:

代码语言:javascript
复制
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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-12-29 01:38:46

使用简单的readline怎么样?我怀疑readlines和/或pd.DataFrame花费了这么多时间。下面这句话对我来说似乎足够快了。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2021-12-29 01:31:40

快速浏览一下您的代码,您似乎采用了以下方法来转换文件:

  1. 打开文件
  2. 将整个文件读入缓冲区
  3. 处理缓冲器

但是,如果您可以对代码进行一些小的调整:

  1. 打开文件
  2. 读一行
  3. 处理线
  4. 继续,直到文件完成。

基本上,采取一种迭代的方法,而不是一次性地读取整个文件。接下来,您可以使用异步使其更快,在这里您可以同时处理所有文件。

票数 0
EN

Stack Overflow用户

发布于 2021-12-29 01:32:27

在不知道你想从这些文件中提取什么数据的情况下,很难给出精确的帮助,但乍一看,你肯定应该使用熊猫内置的文件读取方法之一,这种方法可以保证比代码快很多倍。假设您希望跳过前9行,您可以这样做:

代码语言:javascript
复制
headers = ["a", "b", ...]
pd.read_csv(open("./all/dump80000.data"), skiprows=9, sep=" ", columns=headers)

如果这还不够快,您可以并行化您的代码,因为大部分处理只是将数据加载到内存中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70514234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档