【问题标题】:Separate csv files based on column values根据列值分隔 csv 文件
【发布时间】:2019-07-18 05:16:52
【问题描述】:

不同文件夹和子文件夹中的csv 文件很少。我需要将每个 csv 文件与传入和传出流量分开。

如果来源 == ac:37:43:9b:92:24 && 接收者地址 == 8c:15:c7:3a:d0:1a 然后这些行需要写入 .out.csv 文件。

如果发送器地址 == 8c:15:c7:3a:d0:1a && 目的地== ac:37:43:9b:92:24 然后这些行需要写入 .in.csv 文件。

输出文件(被分隔为传入和传出的文件)必须与输入文件具有相同的名称(例如:如果输入文件是 aaa.csv,那么输出文件将是 aaa.in.csv 和 aaa.out。 .csv)。

输出文件需要像输入文件一样写入文件夹和子文件夹。 我尝试了以下代码,但无法正常工作。 我是编程新手,所以不确定这段代码是对还是错。任何帮助是极大的赞赏。谢谢

import csv
import os
import subprocess

startdir = '.'   
outdir = '.'
suffix = '.csv'

def decode_to_file(cmd, in_file, new_suffix):
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
    fileName = outdir + '/' + in_file[len(startdir):-len(suffix)] + new_suffix
    os.makedirs(os.path.dirname(fileName), exist_ok=True)
    csv_writer = csv.writer(open(fileName, 'w'))
    for line_bytes in proc.stdout:
        line_str = line_bytes.decode('utf-8')
        csv_writer.writerow(line_str.strip().split(','))

for root, dirs, files in os.walk(startdir):
    for name in files:
        if not name.endswith(suffix):
            continue
        in_file = os.path.join(root, name)

        decode_to_file(
            cmd= [if source== ac:37:43:9b:92:24 && Receiver address== 8c:15:c7:3a:d0:1a],
            in_file=in_file,
            new_suffix='.out.csv'
        )
        decode_to_file(
            cmd= [if Transmitter address == 8c:15:c7:3a:d0:1a && Destination== ac:37:43:9b:92:24],
            in_file=in_file,
            new_suffix='.in.csv'
        )

【问题讨论】:

    标签: python python-3.x csv


    【解决方案1】:

    您可以使用 Python 的 CSV 库来处理行,glob.glob 可以用于遍历文件。 os.path.splitext() 可用于帮助更改文件扩展名。例如:

    import csv
    import glob
    import os
    
    for filename in glob.glob('**/*.csv', recursive=True):
        basename, extension = os.path.splitext(filename)
        print(f"Processing - {filename}")
    
        with open(filename, encoding='utf-8') as f_input, \
            open(basename + '.in.csv', 'w', newline='', encoding='utf-8') as f_in, \
            open(basename + '.out.csv', 'w', newline='', encoding='utf-8') as f_out:
    
            csv_input = csv.reader(f_input)
            csv_in = csv.writer(f_in)
            csv_out = csv.writer(f_out)
    
            for row in csv_input:
                if row[3] == 'ac:37:43:9b:92:24' and row[4] == '8c:15:c7:3a:d0:1a':
                    csv_out.writerow(row)
                if row[5] == '8c:15:c7:3a:d0:1a' and row[6] == 'ac:37:43:9b:92:24':
                    csv_in.writerow(row)
    

    这假设您的 CSV 文件采用标准格式,例如aaa,bbb,ccc,dddcsv.reader() 将读取文件的每一行并将其转换为自动以逗号分隔的值列表。所以每一行的第一个值是row[0]

    【讨论】:

    • 想知道您是否可以提供帮助,请stackoverflow.com/questions/57039336/…
    • 是的,我去看看。这是否回答了这个问题?如果是这样,请不要忘记单击灰色勾号以接受答案作为已接受的解决方案。
    • 我接受并投票给你的答案。是的。谢谢,请让我知道您是否可以帮助解决新问题。谢谢
    猜你喜欢
    • 2017-10-10
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多