Ваш входной файл может рассматриваться как CSV, как только мы отфильтруем несколько строк, а именно те, которые не начинаются с символа трубы '|'
, за которым следует пробел ' '
, что оставляет нас с этим:
| Pstng Date|Entry Date|DocumentNo|Itm|Doc..Date |BusA|PK|SG|Sl|Account |User Name |LCurr| Amount in LC|Tx|Assignment |S|
| 07.01.2014|07.02.2014|4919005298| 36|07.01.2019| |81| | |60532640 |tARFooWMOND |EUR | 0,85 | |20140107 | |
| 07.01.2014|07.02.2014|4919065298| 29|07.01.2019| |81| | |60532640 |tARFooWMOND |EUR | 2,53 | |20140107 | |
| 07.01.2014|07.02.2014|4919235298| 30|07.01.2019| |81| | |60532640 |tARFooWMOND |EUR | 30,00 | |20140107 | |
| 07.01.2014|07.02.2014|4119005298| 32|07.01.2019| |81| | |60532640 |tARFooWMOND |EUR | 1,00 | |20140107 | |
| 07.01.2014|07.02.2014|9019005298| 34|07.01.2019| |81| | |60532640 |tARFooWMOND |EUR | 11,10 | |20140107 | |
Ваш вывод в основном пуст, потому что эта проверка x[1].isalpha()
никогда не верна для этих данных. Символ в позиции 1 в каждой строке всегда является пробелом, а не алфавитом.
Нет необходимости открывать входной файл несколько раз, мы можем читать, фильтровать и записывать в выходной файл за один раз:
import csv
ii = 0
with open('file.txt', 'r', encoding='utf8', newline='') as f_input, \
open(str(ii + 1) + 'output.csv', 'w', encoding='utf8', newline='') as f_output:
input_lines = filter(lambda x: len(x) > 2 and x[0] == '|' and x[1] == ' ', f_input)
csv_input = csv.reader(input_lines, delimiter='|')
csv_output = csv.writer(f_output)
for row in csv_input:
csv_output.writerow(col.strip() for col in row[1:-1])
Примечания:
- Вы должны не использовать двоичный режим при чтении текстовых файлов. Используйте режимы
r
и w
соответственно и явно объявите кодировку файла. Выберите кодировку, подходящую для ваших файлов. - Для работы с модулем
csv
откройте файлы с помощью newline=''
(что позволяет модулю csv
выбрать правильные окончания строк) - Вы можете заключить несколько файлов в операторы
with
, используя \
в конце строки. StringIO
совершенно не нужно. - Я не использую
skipinitialspace=True
потому что в некоторых столбцах также есть пробелы в конце. Поэтому я вызываю .strip()
вручную для каждого значения при записи строки. [1:-1]
необходимо, чтобы избавиться от лишних пустых столбцов (до первого и после последнего |
ввход)
Вывод выглядит следующим образом
Pstng Date,Entry Date,DocumentNo,Itm,Doc..Date,BusA,PK,SG,Sl,Account,User Name,LCurr,Amount in LC,Tx,Assignment,S
07.01.2014,07.02.2014,4919005298,36,07.01.2019,,81,,,60532640,tARFooWMOND,EUR,"0,85",,20140107,
07.01.2014,07.02.2014,4919065298,29,07.01.2019,,81,,,60532640,tARFooWMOND,EUR,"2,53",,20140107,
07.01.2014,07.02.2014,4919235298,30,07.01.2019,,81,,,60532640,tARFooWMOND,EUR,"30,00",,20140107,
07.01.2014,07.02.2014,4119005298,32,07.01.2019,,81,,,60532640,tARFooWMOND,EUR,"1,00",,20140107,
07.01.2014,07.02.2014,9019005298,34,07.01.2019,,81,,,60532640,tARFooWMOND,EUR,"11,10",,20140107,