Вы можете сделать что-то вроде этого:
for line in Textfile:
try:
(key, value) = line.split("|")
except ValueError: # split() did not result in two items.
continue # This will deal among other with the delimiter lines ----
key = key.strip()
value = value.strip()
if value: # string is not empty after stripping
d[key] = value
prev_value = value # save for next line if needed
else:
d[key] = prev_value # assign last seen value as there isn't any new one
Обратите внимание, этот пример очень элементарен и в некоторых случаях остается открытым. Например, он потерпит неудачу с NameError
, если первая запись не будет иметь значения во втором столбце (вы можете установить его перед входом в цикл, но какое будет правильное значение, возможно, в этом случае сбой является правильным действием). Вы можете захотеть (пример ввода подсказал бы так) сбросить prev_value
при нажатии на разделитель? На самом деле мы не выполняли никаких проверок входных данных, кроме |
, разделяя его на две части.
Как написано, ваш скрипт должен был на самом деле повысить IndexError
на b=x[1]
при обработке разделителя (----
), как это должно было привести к списку из одного элемента.
Кроме того, при использовании \
в именах файлов, убедитесь, что вы используете необработанные строковые литералы r"g:\somefile.txt"
, чтобы избежать неожиданностей (или просто используйте прямую косую черту, Windows тем временем знает, что делать с этими, немногие непослушные приложения могут все еще не работать ).
Замените if value:
на if value != '\n':
, если ваш ввод фактически содержит буквальную строку '\ n` вместо просто пробелов, за которыми следует новая строка для строк, в которых должно использоваться предыдущее значение.