当前位置: 首页 > 知识库问答 >
问题:

如何完成此Python脚本以操作制表符分隔文件中的数据?

羊冠玉
2023-03-14

我在一个制表符分隔的文件中有一个零件编号和序列号的列表,我需要使用连字符合并在一起来制作一个资产编号。

这是输入:

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个答案

江新
2023-03-14

您可以尝试下面的代码,它可以完美地工作。

Part Number    Serial Number
PART1          SERIAL1
,PART2         SERIAL2
, PART3        SERIAL3
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)
Part Number         Serial Number       Asset Number        
PART1               SERIAL1             PART1-SERIAL1       
,PART2              SERIAL2             PART2-SERIAL2       
, PART3             SERIAL3             PART3-SERIAL3       

>

https://www.programiz.com/python-programming/methods/string/strip

阳枫涟
2023-03-14
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')

如果您有问题,请检查此问题的行数:

使用熊猫读取制表符分隔的文件-适用于Windows,但不适用于Mac

然后,您可以通过调用以下命令另存为分隔的选项卡:

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

如果你还没有大熊猫,这里有一些方法

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

孔鸿哲
2023-03-14

您可以尝试去除逗号,即使它们不在这里也没有问题,因此不再需要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\u number=field[0]'-'字段[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'
 类似资料:
  • 目前,我正在逐行读取由制表符分隔的文件,将每行中的项目拆分,并通过硬编码值50查找由50个项目组成的制表符分隔的行,然后创建数据表。 问题:以制表符分隔的源文件在拆分后有时有50或53项以制表符分隔的行。需要直接读取以制表符分隔的源文件中具有最大制表符分隔符的行,然后继续我的逻辑。 我的C代码

  • 问题内容: 我有以下格式的数据: 现在,我尝试根据最后一个字段对文件进行递减排序。我尝试了以下命令,但是没有按照我们的预期排序。 什么是正确的方法? 这是样本数据。 问题答案: 使用 bash ,可以达到目的: 注意单引号字符串前面的美元符号。您可以在 bash 手册页 的ANSI- C报价部分中 阅读有关它的内容。

  • 我在使用Pandas读取选项卡分隔的文件时遇到问题。 所有单元格值都有双引号,但对于某些行,有一个额外的双引号打断了整个过程。例如: 我得到的错误是:错误标记数据。C错误:第8355行预期有31个字段,SAW58 我使用的代码是: 它适用于其余文件,但不适用于出现额外双引号的文件。

  • 我试图实现的是从Excel工作表(保存在Txt中,制表符分隔)中逐行读取数据,并且每个单独的列都是我想要存储在数组中的不同数据。 我尝试了不同的方法..我甚至从网上下载了CSVReader class,但它不能用。至少这次它读的是真实的人物,而不是讽刺。 我现在的版本是使用bufferedReader和String Tokenizer。但它没有正确阅读。 下面是代码: for(int i =0;

  • 我想把这个字典变成这样的制表符分隔文件: 我应该如何做到这一点。谢啦

  • 问题内容: 我目前有一个CSV文件,当在Excel中打开该文件时,共有5列。仅A和C列对我而言没有任何意义,其余列中的数据无关紧要。 从第8行开始,然后以7的倍数工作(即第8、15、22、29、36行等),我希望使用Python 2.7创建一个字典,其中包含来自这些字段的信息。A列中的数据将是密钥(6位整数),C列中的数据将是密钥的相应值。我试图在下面强调这一点,但格式不是最好的: 如上所述,我正