我正在努力撰寫一個 for 回圈來將大約 100 個.dat檔案轉換為.csv.
我的.dat檔案如下所示:
% Filename : Spm04A1_00288_00001.tif
% Date & Time : 26-Oct-2021 15:45:01
% X-ray Energy (keV) : 20.000
% Exposure Time (s) : 1.030
% Beam Center : 718.20700, 1572.10000
% Sample to Detector Distance (SDD) (mm) : 2175.520
% Detector Pixel Size (mm) : 0.146
% Photodiode Value : 176453.000
% 10 of Sample : 198187
% 10 of Standard : 1
% q(A^-1) I(q) sqrt(I(q))
0.00000000e 00 0.00000000e 00 0.00000000e 00
6.78047596e-04 0.00000000e 00 0.00000000e 00
1.35609519e-03 0.00000000e 00 0.00000000e 00
2.03414279e-03 0.00000000e 00 0.00000000e 00
2.71219038e-03 0.00000000e 00 0.00000000e 00
3.39023798e-03 0.00000000e 00 0.00000000e 00
4.06828558e-03 0.00000000e 00 0.00000000e 00
4.74633317e-03 0.00000000e 00 0.00000000e 00
5.42438077e-03 0.00000000e 00 0.00000000e 00
6.10242836e-03 0.00000000e 00 0.00000000e 00
6.78047596e-03 0.00000000e 00 0.00000000e 00
7.45852356e-03 0.00000000e 00 0.00000000e 00
8.13657115e-03 0.00000000e 00 0.00000000e 00
8.81461875e-03 9.12221748e 00 3.23146137e 00
9.49266634e-03 8.47547513e 00 1.27051027e 00
資料檔案由具有三列 ( scattering vector、intensity和 )的 X 射線散射資料組成sqrt(intensity)。它們是從最近的散射行程中收到的原始資料檔案。為了在不同的軟體中處理這些資料檔案,我需要將它們轉換為.csv.
我能夠使用以下代碼編輯一個檔案(并添加標題):
headerList = ['q(A^-1)', 'I(q)', 'sqrt(I(q))']
data.to_csv("Spm04A3_00258_00001.csv", header=headerList, index=False)
data2 = pd.read_csv("Spm04A3_00258_00001.csv")
print('\nModified file:')
print(data2)
不幸的是,這對于轉換 100 個資料檔案效率不高,但我真的很難撰寫回圈。我將不勝感激任何建議。
uj5u.com熱心網友回復:
我假設您想遍歷每個 CSV 檔案。我將做出一些非常廣泛的假設,由您來驗證。
from pathlib import Path
headerList = ['q(A^-1)', 'I(q)', 'sqrt(I(q))']
csv_dir = Path("/path/where/dat/files/are/located")
for file in csv_dir.glob("*.dat"):
# each file is of type PosixPath. You can access its parent directory, its name, etc
# Here I'm placing the CSV file in the same place as the dat file
csv_file = file.with_suffix(".csv")
# Add your code here, that loads the dat file
data = load_the_dat_file(file)
data.to_csv(csv_file, header=headerList, index=False)
data2 = pd.read_csv(csv_file)
print('\nModified file:')
print(data2)
我拿了你的代碼,把它放在一個回圈中。我不確定這就是您想要實作的目標,但它是對所有.dat檔案的回圈。
額外的:
之后可能沒有必要再次讀取 CSV 檔案。您可以只替換資料框的標題:
data.headers = headerList
uj5u.com熱心網友回復:
這是僅使用標準 Python 模塊的替代方法:
from pathlib import Path
import csv
dats = Path('/folder/with/datfiles')
headers = ['q(A^-1)', 'I(q)', 'sqrt(I(q))']
for dat in dats.glob('*.dat'):
with dat.with_suffix('csv').open('w') as f:
rows = [
_.strip().split()
for _ in dat.read_text().readlines()
if not _.startswith('%')
]
writer = csv.writer(f, delimiter=',')
writer.writerow(headers)
writer.writerows(rows)
上面的代碼將處理.dat檔案dats夾中找到的任何檔案,并.csv在同一檔案夾中生成相應的檔案。
rows是一個串列,其中填充%了當前.dat檔案中不以 a 開頭的所有行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/376582.html
