Как определить количество столбцов в строке по-разному в файле CSV с Python? - PullRequest
0 голосов
/ 06 июля 2019

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

import csv
import glob
import re
import string
import time
import bs4 as bs


# User defined directory for files to be parsed
TARGET_FILES = r'D:\files\'
# User defined file pointer to LM dictionary

# User defined output file
OUTPUT_FILE =  r'D:\ouput\Parser.csv'
# Setup output
OUTPUT_FIELDS = [r'Datei', 'transactionDate', r'transactionsCode', r'Director', r'Officer', r'Titel', r'10-% Eigner', r'sonstiges', r'SignatureDate']


def main():

    f_out = open(OUTPUT_FILE, 'w')
    wr = csv.writer(f_out, lineterminator='\n', delimiter=';')
    wr.writerow(OUTPUT_FIELDS)

    file_list = glob.glob(TARGET_FILES)
    for file in file_list:
        print(file)
        with open(file, 'r', encoding='UTF-8', errors='ignore') as f_in:
            soup = bs.BeautifulSoup(f_in, 'xml')

        output_data = get_data(soup)
        output_data[0] = file                       
        wr.writerow(output_data)


def get_data(soup):

# overrides the transactionDate if more than one transactions disclosed on the current form
# the number determine the column for the output


    _odata = [0] * 9

    try:
        for item in soup.find_all('transactionDate'):
            _odata[1] = item.find('value').text               
    except AttributeError:
        _odata[1] = ('keine Angabe')
    try:
        for item in soup.find_all('transactionAcquiredDisposedCode'):
            _odata[2] = item.find('value').text
    except AttributeError:
        _odata[2] = 'ka'
    for item in soup.find_all('reportingOwnerRelationship'):
        try:
            _odata[3] = item.find('isDirector').text
        except AttributeError:
            _odata[3] = ('ka')
        try:
            _odata[4] = item.find('isOfficer').text
        except AttributeError:
            _odata[4] = ('ka')
        try:
            _odata[5] = item.find('officerTitle').text
        except AttributeError:
            _odata[5] = 'ka'
        try:
            _odata[6] = item.find('isTenPercentOwner').text
        except AttributeError:
            _odata[6] = ('ka')
        try:
            _odata[7] = item.find('isOther').text
        except AttributeError:
            _odata[7] = ('ka')
        try:
            for item in soup.find_all('ownerSignature'):
                _odata[8] = item.find('signatureDate').text
        except AttributeError:
            _odata[8] = ('ka')

    return _odata


if __name__ == '__main__':
    print('\n' + time.strftime('%c') + '\nGeneric_Parser.py\n')
    main()
    print('\n' + time.strftime('%c') + '\nNormal termination.')

На самом деле код работает, но перезаписывает столбцы, если, например, в файле указано более одной даты транзакции.Поэтому мне нужен код, который автоматически использует следующий столбец для каждой даты транзакции.Как это может работать?Я был бы рад, если у кого-то есть решение моей проблемы.Большое спасибо!

1 Ответ

0 голосов
/ 06 июля 2019

Ваша проблема в том, что вы перебираете результат soup.find_all() и каждый раз, когда пишете одно и то же значение.Вам нужно что-то делать с _odata на каждой итерации, иначе вы получите только то, что записано в него в последний раз.

Если вы сможете показать нам, какие данные вы пытаетесь проанализировать на самом делеПохоже, мы могли бы дать более конкретный ответ.

...