Разделить данные на несколько файлов: как обрабатывать (неизвестное количество) несколько соединений - PullRequest
0 голосов
/ 16 января 2019

Я хочу разбить (в реальной жизни: огромный) файл на несколько файлов, указанных, скажем, вторым столбцом в данных. То есть в приведенном ниже примере мне нужны файлы 431.csv и rr1.csv. Моя основная идея заключалась в том, чтобы открывать новые соединения для записи, если они еще не открыты - запись об открытых соединениях находится в dict files_dict, а затем повторять это и закрывать в конце.

Я застрял в том, как ссылаться на эти соединения построчно.

В реальной жизни количество и значение этих имен файлов (второй столбец) заранее неизвестны.

Нашел вдохновение здесь:

запись нескольких файлов одновременно

Python вставляет переменную строку в качестве имени файла

Как разделить текстовый файл на несколько текстовых файлов с помощью Python?

Содержимое данных игрушки в data_in:

123,431,t
43,rr1,3
13,rr1,43
123,rr1,4

Мой наивный псевдокод на данный момент:

files_dict = dict() #dict of file names

with open(data_in) as fi:
    for line in fi:
        x = line.split(',')[1]

        if x not in files_dict:
            fo = x + '.csv'
            files_dict[x] = fo

            '''
            open files_dict[x]
            write line to files_dict[x]

            '''
    else:
        '''
        write line to files_dict[x]
        '''

for fo in files_dict.fos:
    fo.close()

Ответы [ 3 ]

0 голосов
/ 16 января 2019

У вас есть правильная идея, но вы должны хранить файловые объекты, а не имена файлов в dict, и вам не нужен блок else (который должен быть выровнен с if, а не for):

files_dict = {}

with open(data_in) as fi:
    for line in fi:
        x = line.split(',')[1]
        if x not in files_dict:
            files_dict[x] = open(x + '.csv', 'w')
        files_dict[x].write(line)

for file in files_dict.values():
    file.close()
0 голосов
/ 16 января 2019

Вы также можете использовать панд для своего большого csv, так как он хорошо с ним справляется, а затем просто перебрать столбец панд:

df = pd.read_csv('fun.txt', header=None)

string = "tester string"

for row in df[1]:
    fo = row + '.csv'
    f = open(fo, 'a')
    f.write(string+'\n')
    f.close()

вывод 2 файла, 431.csv и rr1.csv. Содержимое 431.csv:

tester string

содержимое rr1.csv:

tester string
tester string
tester string

Это добавит любую добавленную информацию к дублирующимся файлам, я чувствую, что это желаемое поведение, основанное на вашем псевдокоде. Это хорошее решение, потому что оно будет открывать и закрывать ваши файлы, пока оно проходит по столбцу. Таким образом, у вас не будет одновременно открыто 50 файлов, что может вызвать проблемы для вашей операционной системы.

0 голосов
/ 16 января 2019

Поместите в словарь сами объекты file, а не имена файлов.

files_dict = {}

with open(data_in) as fi:
    for line in fi:
        x = line.split(',')[1]

        if x not in files_dict:
            fo = open(x + '.csv', "w")
            files_dict[x] = fo
        else:
            fo = files_dict[x]

        fo.write(x)

for fo in files_dict.values():
    fo.close()
...