【发布时间】:2019-07-16 09:23:28
【问题描述】:
我需要根据列值将几个 csv 文件与传入和传出流量分开。此代码不提供任何输出或任何错误。
如果 source == ac:37:43:9b:92:24 && Receiver address == 8c:15:c7:3a:d0:1a 则需要将这些行写入 .out.csv 文件。
如果 Transmitter address == 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_case_with_ubderscores命名事物,所以 fileName 应该是 file_name 或者只是 filename。 -
@Boris 谢谢,我使用引号作为 MAC 地址并按照建议更改了文件名。但它仍然无法正常工作。我是编程新手,抱歉,我不确定如何定义函数并将其作为 cmd 传递。你能告诉我我该怎么做吗?谢谢
-
用你的新代码更新你的问题。但它不起作用,因为您使用 subprocess.Popen 不正确。正确的方法是使用 csv 阅读器打开文件,遍历行并使用 if 语句过滤它们。
-
@Boris 我用你之前提到的更改更新了代码。请问如何进行其他更改?
-
如果你想用python函数处理每个文件,使用
multiprocessing模块并传递输入和输出文件路径。您还可以传递参数,指定用于确定将数据发送到哪个输出文件的列和值。
标签: python python-3.x csv python-3.7