如何在制表符分隔文本文件中添加具有标题的列

需要将列添加到制表符分隔的文本文件中,并为新列添加标题。不熟悉 awk 命令,因此想询问是否有使用 Python 在制表符分隔文本文件中添加列的方法。

具体来说,需要在以下格式的数据中添加一列:

name    phone   email   website
D G Albright M.S.           
Lannister G. Cersei M.A.T., CEP 111-222-3333    [email protected]  www.got.com
Argle D. Bargle Ed.M.           
Sam D. Man Ed.M.    000-000-1111    [email protected]   www.daManWithThePlan.com
Sam D. Man Ed.M.            
Sam D. Man Ed.M.    111-222-333     [email protected]   www.daManWithThePlan.com
D G Bamf M.S.           
Amy Tramy Lamy Ph.D.    

需要在第一列解析数据,并在名为“area”的新列中添加“执业领域”,在本例中,“CEP”是“执业领域”的示例。迭代文件并使用 pop 函数将“执业领域”与第一列的其余部分分开。然后将此项添加到列表中,该列表在函数中不会被添加至电子表格中。

以下是尝试过的脚本:

def parse_ieca_gc(s):  

    ### HANDLE NAME ELEMENT ######

    degrees = ['M.A.T.','Ph.D.','MA','J.D.',
               'Ed.M.', 'M.A.', 'M.B.A.', 
               'Ed.S.', 'M.Div.', 'M.Ed.', 
               'RN', 'B.S.Ed.', 'M.D.', 'M.S.']
    degrees_list = []

    # check whether the name string has 
    # an area of practice by 
    # checking if there's a comma separator
    if ',' in s['name']:

        # separate area of practice from name 
        # and degree and bind this to var 'area'
        split_area_nmdeg = s['name'].split(',')
        area = split_area_nmdeg.pop()

        # Split the name and deg by spaces. 
        # If there's a deg, it will match with one 
        # of elements and will be stored deg list.
        # The deg is removed name_deg list 
        # and all that's left is the name.
        split_name_deg = re.split('\s',split_area_nmdeg[0])
        for word in split_name_deg:
            for deg in degrees:
                if deg == word:
                    degrees_list.append(split_name_deg.pop())
                name = ' '.join(split_name_deg)

提供的代码也无法正常工作:

fieldnames = ['name','degrees','area','phone','email','website']
with open('ieca_first_col_fake_text.txt','r') as input:
    with open('new_col_dict.txt','w') as output:
        dict_writer = csv.DictWriter(output, fieldnames, delimiter = '\t')
        dict_reader = csv.DictReader(input, delimiter = '\t')
        #dict_writer.writeheader(fieldnames)
        for row in dict_reader:
            print row
            dict_writer.writerow(fieldnames)
            dict_writer.writerow(row)

解决方案

以下是解决该问题的两种方法:

方法一:使用 csv 模块

可以使用 Python 的 csv 模块来轻松地将列添加到制表符分隔的文本文件中。以下是如何使用 csv 模块来实现的:

import csv

with open('ieca_first_col_fake_text.txt', 'r') as input, \
     open('new_col_dict.txt', 'w') as output:
    dict_reader = csv.DictReader(input, delimiter='\t')
    dict_reader.fieldnames.append('area')
    dict_reader.fieldnames.append('degrees')

    dict_writer = csv.DictWriter(output, 
                                 fieldnames=dict_reader.fieldnames, 
                                 delimiter='\t')
    for row in dict_reader:
        print(row)
        dict_writer.writeheader()
        dict_writer.writerow(row)

方法二:使用 pandas 模块

也可以使用 Python 的 pandas 模块来添加列。以下是如何使用 pandas 模块来实现的:

import pandas as pd

df = pd.read_csv('ieca_first_col_fake_text.txt', delimiter='\t')
df['area'] = ''
df['degrees'] = ''

df.to_csv('new_col_dict.txt', sep='\t', index=False)

这两种方法都可以将列添加到制表符分隔的文本文件中,并为新列添加标题。