Как ограничить для каждого цикла чтение нескольких строк с кавычками в виде одной строки в Python? - PullRequest
0 голосов
/ 11 декабря 2018

CSV-файл содержит следующие данные:

"1111", "2222" 2222 "," 3333, 33, 33 "," 444 "," "

csv reader, считывающий эти данные как,

['"1111" "," "2222" 2222 "'," 3333 "," 33 "," 33 "," "444 "','" "']

И когда я пытаюсь преобразовать этот объект чтения в список и пытаюсь повторить его, используя для каждого цикла, цикл рассматривает" 3333, 33, 33 "как три разных значения.Мое требование - читать его как одну строку.

Код:

reader = csv.reader(csv_file, delimiter=',',  quotechar="'", escapechar = "'")
       for row in reader:
           colValues = list(row)
           print(colValues)
           for each in colValues:
               print(each)

Токовый выход:

"1111""
"2222"2222"
"3333
 33
 33"
"444"
""

Желаемый выход:

"1111""
"2222"2222"
"3333, 33, 33"
"444"
""

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Я не думаю, что модуль csv может обрабатывать этот неправильный формат.

Вы можете разделить на основе ",", что даст вам правильные столбцы.Вам также необходимо удалить первую и последнюю кавычки.

>>> row = '"1111"","2222"2222","3333, 33, 33","444",""'
>>> row = row[1:-1]
>>> print(row)
1111"","2222"2222","3333, 33, 33","444","

>>> row.split('","')
['1111"', '2222"2222', '3333, 33, 33', '444', '']

Всего:

with open(csv_file) as lines:
    for line in lines:
        line = line.rstrip()  # need to get rid of newline
        for element in line[1:-1].split('","'):
            print(element)

Вывод:

1111"
2222"2222
3333, 33, 33
444
0 голосов
/ 11 декабря 2018

Обходной путь без библиотеки csv, учитывая входную строку:

input = '"1111"","2222"2222","3333, 33, 33","444",""'

Это возвращает желаемый результат:

res = input.split(",\"")
for i, e in enumerate(res):
  if len(e) > 1 and e[0] != '"' or len(e) == 1:
    res[i] = '"' + e


for e in res:
  print (e)

# "1111""
# "2222"2222"
# "3333, 33, 33"
# "444"
# ""

Но я не знаю, еслиэто работает для всех строк файла.

...