【问题标题】:Add column with a header to a tab-delimited text file?将带有标题的列添加到制表符分隔的文本文件?
【发布时间】:2013-07-05 21:10:05
【问题描述】:

我意识到有一种方法可以使用 'awk' 添加列。

但我对这种替代方法不太熟悉,所以我想问是否有办法使用 Python 将列添加到制表符分隔的文本文件中?

具体来说,这是我需要在其中添加一列的场景:

我有以下格式的数据(我看了一下,可能格式不是很清楚,但是电话、邮箱、网址对应不同的栏目):

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

我正在为第一列编写解析器。我想将“实践领域”,在这种情况下,前任将是“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)

预期输出

name    phone   email   website    area   degrees
D G Albright                                                                      M.A.          
Lannister G. Cersei 111-222-3333    cersei@got.com  www.got.com    CEP    M.A.T.
Argle D. Bargle                                                             Ed.M.           
Sam D. Man  000-000-1111    dman123@gmail.com   www.daManWithThePlan.com   Ed.M.
Sam D. Man                                                                        Ed.M.         
Sam D. Man  111-222-333     dman123@gmail.com   www.daManWithThePlan.com      Ed.M.
D G Bamf                                                                          M.S.          
Amy Tramy Lamy                                                                   Ph.D.  

此代码也不起作用:

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)

【问题讨论】:

  • 预期输出是什么?
  • in this case an ex would be 'CEP', to a new column entitled 'area'. 是什么意思?
  • @goldisfine,不相关,但请用 pep8 或类似的东西格式化你的 python 代码。超过 80 列的代码难以阅读。
  • @goldisfine,也不相关。黄金不好。对金矿开采的环境损害进行简短搜索。你会感到惊讶。

标签: python csv


【解决方案1】:

在此处查看答案,制表符分隔的文件类似于 CSV,以制表符作为分隔符。

How to add a new column to a CSV file using Python?

【讨论】:

  • 当我使用这种方法时,它似乎不是制表符分隔的。
  • this所指的帖子不令人满意,直到它引用了一种创建制表符分隔列的方法后才会被标记为答案。
  • @goldisfine csvreaders 接受指定使用哪个分隔符的参数。默认情况下它是一个逗号,但如果你只添加 kwarg delimiter = "\t" 它将完全一样的工作。这是一个微不足道的编辑,应该接受这个答案。
【解决方案2】:

这就是我最终做的:

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)

【讨论】:

    猜你喜欢
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多