Я новичок в Python, пытаясь преобразовать текстовый файл ниже в CSV-файл. Входной текстовый файл имеет 2 столбца, один из которых является идентификатором, а другой - именем, этот второй столбец может содержать запятую, цифры и пробел.

Входной файл:

1134999 06Crazy Life
6821360 Pang Nakarin
10113088        Terfel, Bartoli- Mozart: Don
10151459        The Flaming Sidebur
6826647 Bodenstandig 3000
10186265        Jota Quest e Ivete Sangalo
6828986 Toto_XX (1977
10236364        U.S Bombs -
1135000 artist formaly know as Mat

Я думал, что это можно решить:

  1. Поставив двойные кавычки, разделяющие два столбца

    Ожидаемый результат может быть:

    "1134999","04Crazy Life"
    "6821360","Pang Nakarin"
    "10113088","Terfel,Bartoli-Mozart: Don"
    
  2. Разделяя файл после первого пробела, затем применяя двойные кавычки во втором столбце (поскольку столбец идентификатора не содержит пробелов / запятых)

    Ожидаемый результат может быть:

    1134999,"04Crazy Life"
    6821360,"Pang Nakarin"
    10113088,"Terfel,Bartoli-Mozart: Don"
    

Я попытался заключить в двойные кавычки два столбца, используя приведенный ниже код. Но он дважды цитирует каждое слово, разделенное пробелом, которое я не хочу:

import csv
import itertools
from StringIO import StringIO

quotedData = StringIO()
with open('demo.txt', 'r') as in_file:
    lines = in_file.read().splitlines()
    stripped = [line.replace(","," ").split() for line in lines]
    grouped = itertools.izip(*[stripped]*1)
    with open('try.csv', 'w') as out_file:
        writer = csv.writer(out_file, quotedData, quoting=csv.QUOTE_ALL)
        writer.writerow(('artist_id', 'artist_name'))
        for group in grouped:
            writer.writerows(group)

Результат:

"artist_id","artist_name"
"1134999","06Crazy","Life"
"6821360","Pang","Nakarin"
"10113088","Terfel","Bartoli-","Mozart:","Don"
"10151459","The","Flaming","Sidebur"
"6826647","Bodenstandig","3000"
"10186265","Jota","Quest","e","Ivete","Sangalo"
"6828986","Toto_XX","(1977"
"10236364","U.S","Bombs","-"
"1135000","artist","formaly","know","as","Mat"
"10299728","Kassierer","-","Musik","für","beide","Ohren"
0
CrazyCoding 27 Май 2017 в 20:57

2 ответа

Лучший ответ

Поскольку идентификаторы выглядят строго числовыми, похоже, что использование регулярного выражения было бы хорошим подходом. (Обратите внимание, что предполагается, что вы хотите убрать начальные пробелы из содержимого второго столбца.)

import re

with open('demo.txt', mode='r') as inp, open('try.csv', 'w') as outp:
    for line in inp:
        m = re.match(r'(\d+)\s+(.*)', line)
        outp.write('"{}","{}"\n'.format(m.group(1), m.group(2)))

Содержимое файла try.csv после запуска:

"1134999","06Crazy Life"
"6821360","Pang Nakarin"
"10113088","Terfel, Bartoli- Mozart: Don"
"10151459","The Flaming Sidebur"
"6826647","Bodenstandig 3000"
"10186265","Jota Quest e Ivete Sangalo"
"6828986","Toto_XX (1977"
"10236364","U.S Bombs -"
"1135000","artist formaly know as Mat"
0
martineau 27 Май 2017 в 20:38

CSV означает «значения, разделенные запятыми», поэтому по определению ',' используется для различения значений столбцов. Поэтому имеет смысл, что вы не можете (простым и понятным способом) вставить в него значения, содержащие запятые.

В качестве альтернативы, в зависимости от того, как ваш выходной файл будет открыт после этого, вы можете использовать другой разделитель / разделитель, кроме ',', например '\t'. (И, возможно, сохраните файл как .tsv).

В Python вы можете использовать pandas для простого создания такого файла:

import pandas as pd

outputDataFrame = pd.DataFrame(grouped, columns=['artist_id', 'artist_name'])
outputDataFrame.to_csv('try.csv', sep='\t', index=False)

Примечание : Таким образом, вам не нужно вручную удалять ',' из ввода.

0
kyriakosSt 27 Май 2017 в 18:10