Python 为每个文件分别创建带有输出和输入文件大小信息的新txt文件

Python 为每个文件分别创建带有输出和输入文件大小信息的新txt文件,python,pandas,dataframe,Python,Pandas,Dataframe,上面的代码部分很好,但第二部分我正在尝试创建一个新的txt文件,其中包含第一部分中创建的文件的信息,分别针对每个文件,例如,在这个txt文件中将写入:输入文件1大小为42,输出文件1大小为324,而第二个文件:输入文件2大小为62,输出文件1大小为543…等 import pandas as pd import glob import os files = glob.glob('*.csv') for file in files: df = pd.read_csv(file, head

上面的代码部分很好,但第二部分我正在尝试创建一个新的txt文件,其中包含第一部分中创建的文件的信息,分别针对每个文件,例如,在这个txt文件中将写入:输入文件1大小为42,输出文件1大小为324,而第二个文件:输入文件2大小为62,输出文件1大小为543…等

import pandas as pd
import glob
import os

files = glob.glob('*.csv')
for file in files:
    df = pd.read_csv(file, header= None)
    df1 = df.iloc[:, :4].agg(['sum','max','std'])
    df1.columns = range(1, len(df1.columns) + 1)
    s = df1.stack()
    L = ['{} of the {}. column is {}'.format(a, b, c) for (a, b), c in s.items()]
    output_file_name = "output_" + file
    pd.Series(L).to_csv(output_file_name ,index=False) 

#this part is good


for file in files:
    with open(file + "stats.txt", 'a+') as f:
        f.write(' input file size is {}'.format(os.path.getsize(file)))
        f.write('output file size is {}'.format(os.path.getsize(output_file_name)))
    f.close()
用于删除原始文件的扩展名,也不必使用
f.close()
,因为
with
会自动关闭文件:

import glob, os
import pandas as pd

files = glob.glob('*.csv')

#loop by all files
for file in files:
    if not file.startswith(('output_','file_size_')):
        #for write to parameter w
        with open(os.path.splitext(file)[0] + "stats.txt", 'w') as f:
            output_file_name = "output_" + file
            #add both format
            infile = 'SIZE OF INPUT FILE {} IS {}, '.format(file, os.path.getsize(file))
            outfile = 'SIZE OF INPUT FILE {} IS {}'.format(output_file_name, 
                                                           os.path.getsize(output_file_name))

            f.write(infile)
            f.write(outfile)
编辑:

解决方案需要变量的输入和输出文件的总和:

import glob, os
import pandas as pd

files = glob.glob('*.csv')

input_all, output_all = 0, 0
#loop by all files
for file in files:
    if not (file.startswith('output_') or file.endswith('stats.txt')):
        with open(os.path.splitext(file)[0] + "stats.txt", 'w') as f:
            output_file_name = "output_" + file
            #add both format
            i = os.path.getsize(file)
            o = os.path.getsize(output_file_name)
            input_all += i
            output_all += o
            infile = 'SIZE OF INPUT FILE {} IS {}, '.format(file, i)
            outfile = 'SIZE OF INPUT FILE {} IS {}'.format(output_file_name, o)

            f.write(infile)
            f.write(outfile)


with open("final_stats.txt", 'w') as f:
    instring = 'SIZE OF ALL INPUT FILES IS {}, '.format(input_all)
    outstring = 'SIZE OF ALL OUTPUT FILES IS {}, '.format(output_all)
    both = 'SIZE OF ALL  FILES IS {}'.format(input_all + output_all)
    f.write(instring)
    f.write(outstring)
    f.write(both)

更好的方法是将输出文件放在与输入不同的目录中,以防止混淆

data/
- input
- output
- stats
您还需要在1个循环中完成,而不是在文件上循环两次

使用
pathlib.Path
和f-strings(python 3.6+)可以:

from pathlib import Path

DATA_DIR = Path("<data>") # fill in the correct path
INPUT_DIR = DATA_DIR / "input"
OUTPUT_DIR = DATA_DIR / "output"
STATS_DIR = DATA_DIR / "stats"

for file in INPUT_DIR.glob("*.csv"):
    df = pd.read_csv(file, header= None)
    df1 = df.iloc[:, :4].agg(['sum','max','std'])
    df1.columns = range(1, len(df1.columns) + 1)
    s = df1.stack()
    L = [f'{a} of the {b}. column is {c}' for (a, b), c in s.items()]

    output_file = OUTPUT_DIR / ("output_" + file.name)
    pd.Series(L).to_csv(output_file ,index=False) 

    size_input = file.stat().st_size
    size_output = output_file.stat().st_size

    stats_file = STATS_DIR / file.with_suffix("stats.txt").name

    message = f"""input file size is {size_input}
    output file size is {size_output}"""

    stats_file.write_text(message)
从pathlib导入路径
数据_DIR=路径(“”)#填写正确的路径
INPUT_DIR=数据_DIR/“输入”
输出目录=数据目录/“输出”
STATS\u DIR=数据\u DIR/“STATS”
对于输入目录glob(“*.csv”)中的文件:
df=pd.read\u csv(文件头=None)
df1=df.iloc[:,:4].agg(['sum','max','std'])
df1.columns=范围(1,len(df1.columns)+1)
s=df1.stack()
L=[f'{a}的{b}。列的{c}表示(a,b),c在s.items()中
output_file=output_DIR/(“output_”+file.name)
pd.Series(L).到csv(输出文件,索引=False)
size\u input=file.stat().st\u size
size\u output=output\u file.stat().st\u size
stats\u file=stats\u DIR/file.with_后缀(“stats.txt”).name
message=f“”“输入文件大小为{size\u input}”
输出文件大小为{size\u output}”“”
统计文件。写入文本(消息)

非常有用,敬请@EdvinŠimić-我想是的,用python编写应该是fster-like-pandas-to_-csv.Great,我现在如何创建一个包含以下统计信息的txt文件:所有输入文件的总大小是,所有输出文件的总和是…所有文件的总和是…谢谢。