我有一個檔案夾,其中包含大約 400 個txt檔案。txt 檔案的最大大小為 2 到 2.5 mb。
我正在嘗試使用 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
uj5u.com熱心網友回復:
使用 simplereadline怎么樣?我懷疑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
uj5u.com熱心網友回復:
快速瀏覽一下您的代碼,您似乎正在采用以下方法來轉換檔案:
- 打開檔案
- 將整個檔案讀入緩沖區
- 處理緩沖區
但是,如果您可以對代碼進行一些小的調整:
- 打開檔案
- 讀一行
- 處理線
- 繼續直到檔案完成
基本上,采用迭代方法而不是一次讀取整個檔案。接下來,您可以使用asyncio使其更快,您可以在其中同時處理所有檔案。
uj5u.com熱心網友回復:
如果不確切知道要從這些檔案中提取哪些資料,很難提供準確的幫助,但乍一看,您絕對應該使用 Pandas 的一種內置檔案讀取方法,該方法保證比您的代碼快很多倍。假設您希望跳過前 9 行,您可以執行以下操作:
headers = ["a", "b", ...]
pd.read_csv(open("./all/dump80000.data"), skiprows=9, sep=" ", columns=headers)
如果這仍然不夠快,您可以并行化您的代碼,因為大部分處理只是將資料加載到記憶體中。
uj5u.com熱心網友回復:
我建議將問題分解為幾個檔案的不同步驟,然后一旦您確定了解如何獨立正確編碼每個步驟,您就可以考慮將它們組合起來:
- 將所有 TXT 轉換為 CSV
- 處理每個 CSV 做你需要的
以下是第 1 步的操作方法:
import csv
out_f = open('output.csv', 'w', newline='')
writer = csv.writer(out_f)
in_f = open('input.txt')
# Consume first 8 lines you don't want
for _ in range(8):
next(in_f)
# Get and fix-up your header
header = next(in_f).replace('ITEM: ATOMS ', '')
writer.writerow(header.split())
# Read the rest of the file line-by-line, splitting by space, which will make a row that the CSV writer can write
for line in in_f:
row = line.split()
writer.writerow(row)
in_f.close()
out_f.close()
當我針對您的示例 .data 檔案運行它時,我得到:
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
...
對所有 400 個 TXT 檔案執行此操作,然后撰寫另一個腳本來處理生成的 CSV。
我使用的是 M1 Macbook Air,具有良好、快速的 SSD。轉換那個 .data 檔案只需不到一秒。除非你有一個非常慢的磁盤,否則我看不到兩個步驟都需要一個多小時。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/396527.html
