Как завершить этот скрипт Python для манипулирования данными в файле с разделителями табуляции? - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть список номеров деталей и серийных номеров в файле с разделителями табуляции, которые мне нужно объединить, используя дефис, чтобы создать номер актива .

Это вход :

Part Number    Serial Number
PART1          SERIAL1
,PART2         SERIAL2
, PART3        SERIAL3

Это то, что я бы хотел желаемый вывод :

Part Number    Serial Number    Asset Number
PART1          SERIAL1          PART1-SERIAL1
,PART2         SERIAL2          PART2-SERIAL2
, PART3        SERIAL3          PART3-SERIAL3

Я попробовал следующий код :

import csv
input_list = []
with open('Assets.txt', mode='r') as input:
    for row in input:
        field = row.strip().split('\t') #Remove new lines and split at tabs
        for x, i in enumerate(field):
            if i[0] == (','):   #If the start of a field starts with a comma
                field[x][0] = ('') #Replace that first character with nothing
                field[x].lstrip() #Strip any whitespace
        print(field)

Этот код дал фактический вывод :

['Part Number', 'Serial Number']
['PART1', 'SERIAL1']
['",PART2"', 'SERIAL2']
['", PART3"', 'SERIAL3']

Моя первая проблемачто мой код для удаления запятых и пробелов в начале всех полей не работает.

Вторая проблема заключается в том, что к пробелам добавлены кавычки.

Третья проблема заключается в том, что я не знаю, как добавить еще один элемент в массив списка ( Номера активов ), чтобы я мог присоединиться к полям.

Может ли кто-нибудь помочь мне решить любую из этих проблем?

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Вы можете попытаться убрать запятые, даже если их нет без проблем, поэтому if[0] == ",": больше не нужен.Вы также удаляете строку, но значение не сохраняется в списке.Это исправлено здесь:

input_list = []
with open('Assets.txt', mode='r') as text_file:
    for row in text_file:
        field = row.strip('\n').split('\t') # Remove new lines and split at tabs.
        for n, word in enumerate(field):
            field[n] = word.lstrip(", ") # Strip any number of whitespaces and commas.
        print(field)

Вывод:

['Part Number', 'Serial Number']
['PART1', 'SERIAL1']
['PART2', 'SERIAL2']
['PART3', 'SERIAL3']

Так что теперь мы можем поместить Asset_number = field[0] + '-' + field[1] куда-нибудь, и он даст вам значение PARTx-SERIALx, которое вы хотели использовать,

Небольшая модификация для получения желаемого результата:

input_list = []
with open('Assets.txt', mode='r') as text_file:
    for m, row in enumerate(text_file):
        field = row.strip('\n').split('\t') # Remove new lines and split at tabs.
        for n, word in enumerate(field):
            field[n] = word.lstrip(", ") # Strip any number of whitespaces and commas.

        if m == 0: # Special case for the header.
            text_to_print = field[0] + '\t' + field[1]  + '\t' + 'Asset Number'
        else:
            Asset_number = field[0] + '-' + field[1]
            text_to_print = field[0] + '\t' + field[1]  + '\t' + Asset_number

        print(text_to_print)

И вывод напечатан :

Part Number     Serial Number   Asset Number
PART1   SERIAL1 PART1-SERIAL1
PART2   SERIAL2 PART2-SERIAL2
PART3   SERIAL3 PART3-SERIAL3

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

'Part Number\tSerial Number\tAsset Number'
'PART1\tSERIAL1\tPART1-SERIAL1'
'PART2\tSERIAL2\tPART2-SERIAL2'
'PART3\tSERIAL3\tPART3-SERIAL3'
0 голосов
/ 23 ноября 2018

Вы можете попробовать приведенный ниже код, и он отлично работает.

input.txt
Part Number    Serial Number
PART1          SERIAL1
,PART2         SERIAL2
, PART3        SERIAL3
split_text_add_combine.py
import re

def split_and_combine(in_path, out_path, new_column_name):
    format_string =  "{0:20s}{1:20s}{2:20s}"
    new_lines = [] # To store new lines

    # Reading input file to process
    with open(in_path) as f:
        lines = f.readlines()

        for index, line in enumerate(lines):
            line = line.strip()
            arr = re.split(r"\s{2,}", line)

            if index == 0:
                # Important to split words in case if words have more than single space
                new_line = format_string.format(arr[0], arr[1], new_column_name) + '\n'
            else:
                # arr = line.split()
                comma_removed_string = (arr[0] + "-" + arr[1]).lstrip(",").lstrip() 
                new_line = format_string.format(arr[0], arr[1], comma_removed_string) + '\n'

            new_lines.append(new_line)

    print(new_lines)

    # Writing new lines to: output.txt
    with open(out_path, "w") as f:
        f.writelines(new_lines)


if __name__ == "__main__":
    in_path = "input.txt"
    out_path = "output.txt"
    new_column_name = "Asset Number"

    split_and_combine(in_path, out_path, new_column_name)
output.txt
Part Number         Serial Number       Asset Number        
PART1               SERIAL1             PART1-SERIAL1       
,PART2              SERIAL2             PART2-SERIAL2       
, PART3             SERIAL3             PART3-SERIAL3       
Справочные материалы:
0 голосов
/ 23 ноября 2018
import pandas as pd

data = {'Part Number': ['PART1',', PART2',',  PART3'],
        'Serial Number': ['Serial1','Serial2','Serial3']}

df = pd.DataFrame(data)

df.loc[:,'AssetNumber'] = df.loc[:,'Part Number'].apply(lambda x: str(x).strip().replace(',','')) + '-' + df.loc[:,'Serial Number'].apply(lambda x: str(x).strip().replace(',',''))

Это будет делать то, что вы хотите

В вашем случае, когда вы имеете дело с вызовом CSV

df = pd.read_csv('filepathasstring',sep='\t')

Если у вас есть проблема, проверьте эту проблему на наличие строк:

Чтение файла с разделителями табуляции с помощью Pandas - работает в Windows, но не на Mac

Затем вы можете сохранить в виде табуляции с разделителями, вызвав:

df.to_csv('filepathasstring', sep='\t')

А вот как получить панд, если у вас их еще нет:

https://pandas.pydata.org/pandas-docs/stable/install.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...