Python 将Csv文件转换为单独的文件

Python 将Csv文件转换为单独的文件,python,python-3.x,csv,python-3.7,Python,Python 3.x,Csv,Python 3.7,我需要根据列值将几个csv文件与传入和传出流量分开。这段代码没有给出任何输出,也没有任何错误 如果source==ac:37:43:9b:92:24&&Receiver address==8c:15:c7:3a:d0:1a,则需要将这些行写入.out.csv文件 import csv import os import subprocess startdir = '.' outdir = '.' suffix = '.csv' def decode_to_file(cmd, in_fil

我需要根据列值将几个csv文件与传入和传出流量分开。这段代码没有给出任何输出,也没有任何错误

如果source==ac:37:43:9b:92:24&&Receiver address==8c:15:c7:3a:d0:1a,则需要将这些行写入.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= [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= [Transmitter address == "8c:15:c7:3a:d0:1a" && Destination== "ac:37:43:9b:92:24"],
            in_file=in_file,
            new_suffix='.in.csv'
        )
如果发送器地址==8c:15:c7:3a:d0:1a&&Destination==ac:37:43:9b:92:24,则需要将这些行写入.in.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= [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= [Transmitter address == "8c:15:c7:3a:d0:1a" && Destination== "ac:37:43:9b:92:24"],
            in_file=in_file,
            new_suffix='.in.csv'
        )

Subprocess.Popen用于运行bash命令,而不是python。你不能把if语句放在这样的列表中,它在你定义它的行上执行一次。您可以定义一个小函数并将其作为
cmd
传递,而且,MAC地址应该是一个字符串,用引号括起来。最后,在Python中,我们使用
lower\u case\u和\u ubderscores
来命名事物,因此文件名应该是file\u name或干脆是fileName。@Boris谢谢,我使用引号作为MAC地址,并按照建议更改了文件名。但它仍然不起作用。我是编程新手,抱歉,我不知道如何定义函数并将其作为cmd传入。你能告诉我怎么做吗。感谢您使用新代码提出问题。但它不会工作,因为您错误地使用了subprocess.Popen。正确的方法是使用csv读取器打开文件,对行进行迭代,并使用if语句对其进行过滤。@Boris I使用您前面提到的更改更新了代码。如何进行其他更改?如果要使用python函数处理每个文件,请使用
多处理
模块,并将输入和输出文件路径传递给它。您还可以传递参数,指定用于确定将数据发送到哪个输出文件的列和值。感谢我尝试了上述代码,我没有收到任何错误,但也没有输出。我附上了一个示例csv文件。抱歉,我刚才添加了一个image@Hasa您的行称为“目的地地址”,而不是屏幕截图/问题中的“目的地”。我已经更新了代码。而且,代码应该已经抛出了一个
KeyError
。如果您没有看到任何错误,这可能意味着它找不到任何csv文件。是否所有csv文件都以
.csv
结尾?您是从保存所有csv文件的目录运行此脚本,还是将
startdir
更改为该目录的路径?如果您将csv文件移动到与脚本相同的位置,它至少会起作用。非常感谢。成功了。我能问你一个问题吗。在这里,输出文件(.in.csv和out.csv)与原始csv文件写入同一位置。是否可以将所有输出文件(包括.in.csv和out.csv)保存到不同的位置/文件夹中,与原始文件具有相同的文件夹、子文件夹名称。谢谢你,如果你对此感到满意,请给我一个接受的提示和标记。我为想象中的互联网点工作。