根据行值将大型 csv 文件拆分为多个文件 python
Split Large csv File into multiple files depending on row value python
背景
我有一个特定格式 (NEM12) 的大型 csv 文件,该文件太大而无法使用。文件格式如下;
- 文件总是以 100 开头
- 带有 200 的行表示新数据集的开始
- 300 或 400 的行表示数据集的数据
- 文件总是以 900 结尾
下面的例子
100 NEM12
200 NMI INFO INFO
300 20211001 0 0 0 0
400 20 20 F17
300 20211002 0 0 0 0
300 20211003 0 0 0 0
200 NMI INFO INFO
300 20211001 0 0 0 0
300 20211002 0 0 0 0
300 20211003 0 0 0 0
300 20211004 0 0 0 0
300 20211005 0 0 0 0
…
200 NMI INFO INFO
300 20211001 0 0 0 0
300 20211002 0 0 0 0
400 20 20 F17
300 20211003 0 0 0 0
300 20211004 0 0 0 0
900
我想做什么
我正在尝试将大文件拆分成数百个小文件。每个较小的文件将包含一个 200 行以及相应的 300 和 400 行值。
我试过的
我尝试通过 pandas 读取文件,但由于其形状不规则,未能成功。
我已经能够通过下面的代码成功地遍历行,但是它将每个值拆分到它自己的列中(即,它不是 200,而是 2、0、0)。
不胜感激。
for line in open(test):
if left(line, 3) == '200':
try:
with open(fname, 'a', newline='') as f_object:
writer_object = writer(f_object)
writer_object.writerow('900')
f_object.close()
except NameError:
print('ignore')
fname = str(line.replace(',', '').replace('\n', '')) + '.csv'
with open(fname, 'w', newline='') as f_object:
writer_object = writer(f_object)
writer_object.writerow('100')
writer_object.writerow(line)
if left(line, 3) == '300' or left(line, 3) == '400':
with open(fname, 'a', newline='') as f_object:
writer_object = writer(f_object)
writer_object.writerow(line)
这是一种方法。
fn = 'NEM12#000000000000001#CNRGYMDP#NEMMCO.csv'
cnt = 0
outfn = f'out_{cnt}.csv'
with open(fn, 'r') as f:
for line in f:
if line.startswith('100,'): # don't write
continue
elif line.startswith('900'): # don't write
continue
elif line.startswith('200,'): # write detect start
cnt += 1
outfn = f'out_{cnt}.csv' # new filename
if line.startswith(('200,', '300,', '400,')):
with open(outfn, 'a') as w: # write
w.write(f'{line}'):
输出将是out_1.csv, out_2.csv etc
感谢@Ferdy 的帮助,
使用您提供的代码以及我的原始代码,我能够解决问题
from csv import writer
for line in open(test):
if line.startswith('200'):
try:
with open(fname, 'a', newline='') as f:
w = writer(f)
w.writerow(['900'])
f.close()
except NameError:
print('ignore')
flist = [str(line).split(",")[x] for x in [1, 3, 6, 7, 8]]
fname = '_'.join(flist) + '.csv'
print(fname)
with open(fname, 'w', newline='') as f:
w = writer(f)
w.writerow(['100', 'NEM12', 'DATECREATED', 'MDYMDP', 'NAME'])
w.writerow(str(line).split(","))
if line.startswith(('300,', '400,')):
with open(fname, 'a', newline='') as f:
w = writer(f)
w.writerow(str(line).split(","))
背景
我有一个特定格式 (NEM12) 的大型 csv 文件,该文件太大而无法使用。文件格式如下;
- 文件总是以 100 开头
- 带有 200 的行表示新数据集的开始
- 300 或 400 的行表示数据集的数据
- 文件总是以 900 结尾
下面的例子
100 NEM12
200 NMI INFO INFO
300 20211001 0 0 0 0
400 20 20 F17
300 20211002 0 0 0 0
300 20211003 0 0 0 0
200 NMI INFO INFO
300 20211001 0 0 0 0
300 20211002 0 0 0 0
300 20211003 0 0 0 0
300 20211004 0 0 0 0
300 20211005 0 0 0 0
…
200 NMI INFO INFO
300 20211001 0 0 0 0
300 20211002 0 0 0 0
400 20 20 F17
300 20211003 0 0 0 0
300 20211004 0 0 0 0
900
我想做什么
我正在尝试将大文件拆分成数百个小文件。每个较小的文件将包含一个 200 行以及相应的 300 和 400 行值。
我试过的
我尝试通过 pandas 读取文件,但由于其形状不规则,未能成功。
我已经能够通过下面的代码成功地遍历行,但是它将每个值拆分到它自己的列中(即,它不是 200,而是 2、0、0)。
不胜感激。
for line in open(test):
if left(line, 3) == '200':
try:
with open(fname, 'a', newline='') as f_object:
writer_object = writer(f_object)
writer_object.writerow('900')
f_object.close()
except NameError:
print('ignore')
fname = str(line.replace(',', '').replace('\n', '')) + '.csv'
with open(fname, 'w', newline='') as f_object:
writer_object = writer(f_object)
writer_object.writerow('100')
writer_object.writerow(line)
if left(line, 3) == '300' or left(line, 3) == '400':
with open(fname, 'a', newline='') as f_object:
writer_object = writer(f_object)
writer_object.writerow(line)
这是一种方法。
fn = 'NEM12#000000000000001#CNRGYMDP#NEMMCO.csv'
cnt = 0
outfn = f'out_{cnt}.csv'
with open(fn, 'r') as f:
for line in f:
if line.startswith('100,'): # don't write
continue
elif line.startswith('900'): # don't write
continue
elif line.startswith('200,'): # write detect start
cnt += 1
outfn = f'out_{cnt}.csv' # new filename
if line.startswith(('200,', '300,', '400,')):
with open(outfn, 'a') as w: # write
w.write(f'{line}'):
输出将是out_1.csv, out_2.csv etc
感谢@Ferdy 的帮助,
使用您提供的代码以及我的原始代码,我能够解决问题
from csv import writer
for line in open(test):
if line.startswith('200'):
try:
with open(fname, 'a', newline='') as f:
w = writer(f)
w.writerow(['900'])
f.close()
except NameError:
print('ignore')
flist = [str(line).split(",")[x] for x in [1, 3, 6, 7, 8]]
fname = '_'.join(flist) + '.csv'
print(fname)
with open(fname, 'w', newline='') as f:
w = writer(f)
w.writerow(['100', 'NEM12', 'DATECREATED', 'MDYMDP', 'NAME'])
w.writerow(str(line).split(","))
if line.startswith(('300,', '400,')):
with open(fname, 'a', newline='') as f:
w = writer(f)
w.writerow(str(line).split(","))