2017-02-20 39 views
0

как я имею вопрос при попытке разделить строку текста я получаю из текстового файла. Это довольно большой файл, но я буду вставлять только 2 строки, с оригинальным текстомPython - Ошибка при попытке линии разделения текста

1307; Форма собственности: часть 1/1 <> Tarnowiec Коммуна <> <> 211 <> 30-200 ZipCode; KS1J/00080000/2; 861; Свойство: 1,1 часть <> РАЙОН Тарновец <> <> 211 <> 30-200 ZipCode; KS1J/00080990/2;

1306; Форма собственности: часть 1/1 <> Jan Nowak <> им. .: Tomasz_ родились Мария <> Где-то 2 <> 30-200 ZipCode; KW22222; 861; Форма собственности: часть 1/1 <> Тарновец Коммуну <> <> Tarnowiec 211 <> 30-200 ZipCode; KS1W/00080000/1;

данных я получаю из этого файла будет использоваться для создания отчетов, а <>_ и будет использоваться для дальнейшего Top форматирования. Я хочу иметь линию разделения на ;

Проблема, я получаю сообщение об ошибке на двух методах расщепления.

первый, основной .split(';')

dane = open('dane_protokoly.txt', 'r') 
for line in dane: 
    a,b,c,d,e,f,g = line.split(';') 
    print(a) 
    print(b) 
    print(c) 
    print(d) 
    print(e) 
    print(f) 
    print(g) 

Я получаю сообщение об ошибке после печати первого цикла

Traceback (most recent call last): 
File "C:\Users\Admin\Desktop\Nowy folder\costam.py", line 36, in <module> 
a,b,c,d,e,f,g = line.split(';') 
ValueError: not enough values to unpack (expected 7, got 1) 

То же с созданием списков из этого файла (список выглядит следующим образом: [ '1307', 'свойство: 1,1 часть <> РАЙОН Tarnowiec <> <> 211 <> 30-200 ZipCode', 'KS1J/00080000/2', '861', «свойство: 1,1 часть <> РАЙОН Tarnowiec <> <> 211 <> 30-200 ZipCode '' KS1J/00080990/2 '' «]

dane = plik('dane_protokoly.txt') 
for line in dane: 
    a = line[0] 
    b = line[1] 
    c = line[2] 
    d = line[3] 
    e = line[4] 
    f = line[5] 
    g = line[6] 
    print(str(a)) 
    print(str(b)) 
    print(str(c)) 
    print(str(d)) 
    print(str(e)) 
    print(str(f)) 

ошибки, а также получить должным образом после печати первой строки:

Traceback (most recent call last): 
    File "C:\Users\Admin\Desktop\Nowy folder\costam.py", line 22, in <module> 
    b = line[1] 
IndexError: list index out of range 

Любой идея, почему я получаю сухие ошибки?

+4

первых вы получаете, потому что вы * угадывание неправильно * Количество элементов в 'split' возвращается. Угадание - это плохая практика. Просто сохраните результаты в 'list'. попробуйте 'print (line)' перед тем, как расщепить его, чтобы убедиться в этом сами. –

+0

первая строка напечатана правильно, следующая строка имеет ошибку – krizz

ответ

1

Как уже упоминался Рахул K P, проблемы между ними вашими линиями с данными «пустой» строка. Вы должны пропустить их при попытке разделить ваши данные.

Возможно использовать это в качестве отправной точки:

with open(r"dane_protokoly.txt", "r") as data_file: 
    for line in data_file: 
     #skip rows which only contain a newline special char 
     if len(line)>1: 
      data_row=line.strip().split(";") 
      print(data_row) 
0

Ваша вторая стратегия не работает, потому что линия [0] является по существу вся линия, как она не содержит пробелов и по умолчанию при расщеплении пространств. , поэтому нет никакой линии [1] линии или [2], поэтому ... и вы получите буквенный индекс из ошибок диапазона.

Я надеюсь, что это помогает. И я надеюсь, что это решит вашу проблему.

+0

первая строка напечатана правильно, вторая строка возвращает ошибку – krizz

3

Иногда line.split(';') не дает 7 значений для распаковки для (a,b,c,...), так лучше итерацию, как это,

lst = line.split(';') 
for item in lst: 
    print item 

И есть перевод строки между это делает проблемы для вас, И синтаксис, СЛЕДОВАЛИ плохая практика

Вы можете изменить свой код, как это,

for line in open("'dane_protokoly.txt'").read().split('\n'): 
    lst = line.split(';') 
    for item in lst: 
     print item 

Это не заботится о новой строкой между ними,

+0

, ее все в порядке, но мне нужен каждый следующий элемент, называемый «a, b, c, d, e, f, g. , и я точно знаю, что каждая строка будет иметь 7 значений для распаковки, поэтому я использовал этот тип разделения. и, первая строка печатается правильно, независимо от моего метода. – krizz

+0

@krizz. Между тем это создает проблемы для новой строки. На второй итерации она дает только новую строку. –

+0

ОК, ваш ответ привел меня к решению. у файла есть некоторые «скрытые» (?) символы, мне нужно сначала очистить его, и он работает правильно. – krizz

 Смежные вопросы

  • Нет связанных вопросов^_^