python - CSV文件分成单独的文件
问题描述
我需要根据列值将几个 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'
)
解决方案
import csv
from pathlib import Path
startdir = Path(".")
outputdir = startdir / "filtered"
def write_csv(filename, rows, fieldnames):
# if there's nothing to write, don't write anything
if not rows:
return
filename.parent.mkdir(parents=True, exist_ok=True)
with open(filename, "w") as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(rows)
for input_filename in startdir.glob("**/*.csv"):
with open(input_filename) as input_csv:
inrows = []
outrows = []
reader = csv.DictReader(input_csv)
for row in reader:
if (
row["Source address"] == "ac:37:43:9b:92:24"
and row["Receiver address"] == "8c:15:c7:3a:d0:1a"
):
outrows.append(row)
if (
row["Transmitter address"] == "8c:15:c7:3a:d0:1a"
and row["Destination address"] == "ac:37:43:9b:92:24"
):
inrows.append(row)
output_filename = outputdir / input_filename.relative_to(startdir)
write_csv(output_filename.with_suffix(".out.csv"), outrows, reader.fieldnames)
write_csv(output_filename.with_suffix(".in.csv"), inrows, reader.fieldnames)
推荐阅读
- python - 部署 Selenium Python 脚本以在调度程序上运行
- javascript - Axios 获取请求在我的 React 应用程序中失败
- tfs - 如何将 ProcessTemplate 属性添加到 Azure Devops 项目的自定义进程配置
- swift - 更新 Xcode 12 后如何修复操作按钮?
- kotlin - 为什么在 Kotlin 中可以从逆变列表中读取
- angular - 在Angular中将数据从子级传递给具有n个子级的父级,而不会在每个组件中发出
- java - 我的 AndroidManifest.xml 充满了错误,为什么?
- c++ - 读取输入文件 IloCplex C++
- reactjs - 如何使用 2 个相同的值处理材质 ui 的选择
- php - Shuffle() 返回相同的结果