带列的文本文件到CSV的转换

yizd12fk  于 2023-06-27  发布在  其他
关注(0)|答案(2)|浏览(122)

我有一个结构如下的文本文件。第一行是标题,下一行定义两个列名(nm和sigma)。如何将其转换为csv文件并保存?此外,如果我有100个这种格式的文本文件,什么是最有效的方法来自动化这个过程?

  • HC 00 H; Nagakura等人; 298 K;气相 *

nm sigma(cm 2/分子)x 10-18
154 8.680
155 9.180
156 9.480
157 9.670
158 9.790
159 9.730
160 9.520

pnwntuvh

pnwntuvh1#

您可以使用pandas Python库来实现此目的。
为了读取文本文件并将其保存为csv,您可以这样做:

import pandas as pd

def txt_to_csv(pathToTxtFile, pathToCsvFile):
    # reading the txt file
    df = pd.read_csv(<pathToTxtFile>, skiprows=1, sep=' ')

    # renaming columns
    new_col_name = f'{df.columns[1]} {df.columns[2]} {df.columns[3]}'
    df.rename(columns={df.columns[1]: new_col_name}, inplace=True)

    # dropping extra columns
    df = df.drop(columns=[df.columns[2], df.columns[3]])

    # saving as csv
    df.to_csv(<pathToCsvFile>, index=False)

为了对多个文件自动执行此操作,您可以将它们全部存储在一个文件夹中,然后循环它们并在循环中调用上面的函数txt_to_csv,有点像这样:

import os

for txtfile in os.listdir("<pathToFolder>"):
    if txtfile.lower().endswith(".txt"):
        txt_to_csv(txtfile, os.path.splitext(txtfile)[0]+".csv")

此脚本将使用相同的文件名以.csv将它们全部保存在同一文件夹中

6qftjkof

6qftjkof2#

如果每个文件的标题不同,你必须调整。而且,我是多线程的新手,这可能是矫枉过正。
https://onlinegdb.com/5S2R-yjpD

import csv
from pathlib import Path
from concurrent.futures import ThreadPoolExecutor

def worker(file, csv_file):
    print(f'converting file: {file} -> {csv_file}')
    with open(file, newline=None) as IN, open(csv_file, 'w', newline=None) as OUT:
        next(IN) # throwaway first line
        headers = next(IN).strip().split(maxsplit=1) # adjust if files vary
        rows = (row for row in csv.reader(IN, delimiter=' '))
        csv.writer(OUT).writerows((headers, *rows))
    print(f'done converting file: {file} -> {csv_file}')

with ThreadPoolExecutor(10) as e:
    # adjust your path accordingly
    for file in Path('.').glob('*.txt'):
        csv_file = f'{file.stem}.csv'
        e.submit(worker, file, csv_file)

相关问题