Python 如何使用行号分割csv文件,行号作为参数传递并保存到不同的文件中

Python 如何使用行号分割csv文件,行号作为参数传递并保存到不同的文件中,python,Python,这里每个文件将有2行。文件名包含时间、数据、小时和秒 我有5行在一个csv文件 我将用户的输入作为参数 如果用户给出2,那么我的每个文件将有2行 第一个2行将在第一个文件中,第二个2行在第二个文件中,最后一行在第三个文件中 最后一个文件将有一行 文件名将有小时分钟秒 下面是csv文件 python script.py 2 我需要分成3个不同的文件,拆分行数作为参数 以下是方法 以分割线为参数,用带时间戳的数据保存 下面是用日期、小时、时间保存数据的代码。我需要一些逻辑来划分这条线并从那

这里每个文件将有2行。文件名包含时间、数据、小时和秒

  • 我有5行在一个csv文件
  • 我将用户的输入作为参数
  • 如果用户给出2,那么我的每个文件将有2行
  • 第一个2行将在第一个文件中,第二个2行在第二个文件中,最后一行在第三个文件中
  • 最后一个文件将有一行
  • 文件名将有小时分钟秒
下面是csv文件

python script.py 2
我需要分成3个不同的文件,拆分行数作为参数

以下是方法

  • 以分割线为参数,用带时间戳的数据保存
下面是用日期、小时、时间保存数据的代码。我需要一些逻辑来划分这条线并从那里继续

1,Network activity,ip-dst,80.179.42.44,,1,20160929
2,Payload delivery,md5,4ad2924ced722ab65ff978f83a40448e,,1,20160929
3,Network activity,domain,alkamaihd.net,,1,20160929
4,Payload delivery,md5,197c018922237828683783654d3c632a,,1,20160929
5,Network activity,domain,dnsrecordsolver.tk,,1,20160929
python脚本.py 2

然后将生成3个文件,每个文件中有2行,最后一个文件将有一行

预料之外

3文本文件将生成两行,每行有一个linux命令

将拆分为每行2行的文件

用于在文件名后面添加小时、分钟和秒

split -l 2 Oil.csv

您可以使用
(行号+1)%n找到要拆分为n行的行号:

split -l 2 Oil.csv --additional-suffix=`date +"%H:%M:%S"`
save_file(newcontent)
将是您将字符串保存到新文件的功能。

您的时间字符串
%Y%m%d-%H%m%S
不会生成唯一的文件名。您可以添加一个计数器或使用
str(datetime.datetime.now())+“.log”

以下是在
Python3
中执行此操作的方法

import sys
import datetime

def save_file(newcontent):
    savenewfile = str(datetime.datetime.now()) + ".log"
    with open(savenewfile, 'w') as dstfile:
        dstfile.write(newcontent)

split_at = int(sys.argv[1])
newcontent = ""

with open("Oil.csv", "r") as f:
    for i, line in enumerate(f):
        newcontent += line
        if (i+1) % split_at == 0: # i+1 because i starts at 0
            save_file(newcontent)
            newcontent = ""

# save remaining lines
if newcontent:
    save_file(newcontent)
示例运行:
python3 main.py Sample.csv 2
生成
3
文件:

import argparse
import time
from itertools import zip_longest


def grouper(n, iterable, fill_value=None):
    args = [iter(iterable)] * n
    return zip_longest(fillvalue=fill_value, *args)


def splitter(n_lines, file):
    with open(file) as f:
        for i, payload in enumerate(grouper(n_lines, f, fill_value=''), 1):
            f_name = f"{time.strftime('%Y%m%d-%H%M%S')}_{i*n_lines}.log"
            with open(f_name, 'w') as out:
                out.writelines(payload)


def get_parser():
    parser = argparse.ArgumentParser(description="File splitter")
    parser.add_argument("file", metavar="FILE", type=str, help="Target file to be chopped up")
    parser.add_argument("n_lines", type=int, default=2, help="Number of lines to output per file")
    return parser


def command_line_runner():
    parser = get_parser()
    args = vars(parser.parse_args())
    splitter(args['n_lines'], args['file'])


if __name__ == "__main__":
    command_line_runner()

前两行各有两行,最后一行是一行

sample.csv
的内容如示例所示:

20200921-095943_2.log
20200921-095943_4.log
20200921-095943_6.log

什么是拉链longest@Nons
zip_longest
创建一个迭代器,如果iterables的长度不均匀,缺少的值将用fillvalue填充。在此处阅读更多信息-TypeError:不支持%的操作数类型:'int'和'str'我在上面的代码中添加了一个函数save_file(newcontent),但它不是saving@Nons对不起,我对约会时间的建议有点不清楚。文件名必须是字符串。例如:
str(datetime.datetime.now())+“.log”
我也尝试过保存文件(newcontent)名称错误:名称“save\u file”不是definedIt适合我。可能您的操作系统不允许在文件名中使用某些字符。它可能是
datetime.datetime.now().strftime(“%Y%m%d-%H%m%S_%f”)+”.log“
创建一个更兼容的名称
20200921-095943_2.log
20200921-095943_4.log
20200921-095943_6.log
1,Network activity,ip-dst,80.179.42.44,,1,20160929
2,Payload delivery,md5,4ad2924ced722ab65ff978f83a40448e,,1,20160929
3,Network activity,domain,alkamaihd.net,,1,20160929
4,Payload delivery,md5,197c018922237828683783654d3c632a,,1,20160929
5,Network activity,domain,dnsrecordsolver.tk,,1,20160929