pythoncsv按内容切分_在python中按列的值拆分大csv文件

#!/usr/bin/env python3

import binascii

import csv

import os.path

import sys

from tkinter.filedialog import askopenfilename, askdirectory

from tkinter.simpledialog import askinteger

def split_csv_file(f, dst_dir, keyfunc):

csv_reader = csv.reader(f)

csv_writers = {}

for row in csv_reader:

k = keyfunc(row)

if k not in csv_writers:

csv_writers[k] = csv.writer(open(os.path.join(dst_dir, k),

mode='w', newline=''))

csv_writers[k].writerow(row)

def get_args_from_cli():

input_filename = sys.argv[1]

column = int(sys.argv[2])

dst_dir = sys.argv[3]

return (input_filename, column, dst_dir)

def get_args_from_gui():

input_filename = askopenfilename(

filetypes=(('CSV', '.csv'),),

title='Select CSV Input File')

column = askinteger('Choose Table Column', 'Table column')

dst_dir = askdirectory(title='Select Destination Directory')

return (input_filename, column, dst_dir)

if __name__ == '__main__':

if len(sys.argv) == 1:

input_filename, column, dst_dir = get_args_from_gui()

elif len(sys.argv) == 4:

input_filename, column, dst_dir = get_args_from_cli()

else:

raise Exception("Invalid number of arguments")

with open(input_filename, mode='r', newline='') as f:

split_csv_file(f, dst_dir, lambda r: r[column-1]+'.csv')

# if the column has funky values resulting in invalid filenames

# replace the line from above with:

# split_csv_file(f, dst_dir, lambda r: binascii.b2a_hex(r[column-1].encode('utf-8')).decode('utf-8')+'.csv')

将其另存为split-csv.py,并从资源管理器或命令运行它

行。

例如,从列1拆分superuser.csv,并编写

在dstdir下输出文件使用:python split-csv.py data.csv 1 dstdir

如果不带参数运行它,基于Tkinter的GUI将提示您

要选择输入文件,列(基于1的索引)和

目标目录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值