Разделить большой текстовый файл на маленькие в зависимости от местоположения
Предположим, у меня есть большой файл file.txt, и он содержит данные около 300 000. Я хочу разделить его на основе определенного ключевого местоположения. Смотрите file.txt ниже:
Line 1: U0001;POUNDS;**CAN**;1234
Line 2: U0001;POUNDS;**USA**;1234
Line 3: U0001;POUNDS;**CAN**;1234
Line 100000; U0001;POUNDS;**CAN**;1234
Места ограничены до 10-15 разных наций. И мне нужно отделить каждую запись определенной страны в одном конкретном файле. Как сделать эту задачу в Python
Спасибо за помощь
4 ответа
Это будет работать с очень малой нагрузкой на память при записи каждой строки при ее чтении.
Алгоритм:
- открыть входной файл
- прочитать строку из входного файла
- получить страну от линии
- если новая страна, то откройте файл для страны
- напишите строку в файл страны
- цикл, если больше строк
- закрыть файлы
Код:
with open('file.txt', 'r') as infile:
try:
outfiles = {}
for line in infile:
country = line.split(';')[2].strip('*')
if country not in outfiles:
outfiles[country] = open(country + '.txt', 'w')
outfiles[country].write(line)
finally:
for outfile in outfiles.values():
outfile.close()
with open("file.txt") as f:
content = f.readlines()
# you may also want to remove whitespace characters like `\n` at the end of each line
text = [x.strip() for x in content]
x = [i.split(";") for i in text]
x.sort(key=lambda x: x[2])
from itertools import groupby
from operator get itemgetter
y = groupby(x, itemgetter(2))
res = [(i[0],[j for j in i[1]]) for i in y]
for country in res:
with open(country[0]+".txt","w") as writeFile:
writeFile.writelines("%s\n" % ';'.join(l) for l in country[1])
будет группировать по вашему товару! Надеюсь, поможет!
# the formatting-function for the filename used for saving
outputFileName = "{}.txt".format
# alternative:
##import time
##outputFileName = lambda loc: "{}_{}.txt".format(loc, time.asciitime())
#make a dictionary indexed by location, the contained item is new content of the file for the location
sortedByLocation = {}
f = open("file.txt", "r")
#iterate each line and look at the column for the location
for l in f.readlines():
line = l.split(';')
#the third field (indices begin with 0) is the location-abbreviation
# make the string lower, cause on some filesystems the file with upper chars gets overwritten with only the elements with lower characters, while python differs between the upper and lower
location = line[2].lower().strip()
#get previous lines of the location and store it back
tmp = sortedByLocation.get(location, "")
sortedByLocation[location]=tmp+l.strip()+'\n'
f.close()
#save file for each location
for location, text in sortedByLocation.items():
with open(outputFileName(location) as f:
f.write(text)
Похоже, что у вас есть csv
файл. csv
обозначает разделенные запятыми значения, но любой файл, который использует другой разделитель (в данном случае точка с запятой ;
) можно рассматривать как csv
файл.
Мы будем использовать модуль Python csv
чтобы прочитать файл, а затем написать файл для каждой страны
import csv
from collections import defaultdict
d = defaultdict(list)
with open('file.txt', 'rb') as f:
r = csv.reader(f, delimiter=';')
for line in r:
d[l[2]].append(l)
for country in d:
with open('{}.txt'.format(country), 'wb') as outfile:
w = csv.writer(outfile, delimiter=';')
for line in d[country]:
w.writerow(line)