根据列值分隔csv文件

时间:2019-07-15 14:40:36

标签: python python-3.x csv

不同的文件夹和子文件夹中的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'
        )

enter image description here

1 个答案:

答案 0 :(得分:0)

您可以利用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]