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