【问题标题】:Python find and replace with NA for delimited text filesPython查找并用NA替换分隔文本文件
【发布时间】:2014-10-30 00:41:11
【问题描述】:

我对 python 很陌生。假设我在一个(非常大的)分隔文本文件中有数据,如下所示:

a|b|c|d|e

1|.|.|-|.

1.2|2.6|||1.7

由于文本文件很大,我想逐行读取和写入。我想用字符串NA 替换.- 或空的单元格。这是我尝试过的:

import csv

f = open('sample1_fixed.txt','wb')

targets1, new1 = ['|.|','|-|','||','| |'], '|NA|'

for line in open('sample1.txt', 'rb'):
    for target in targets1:
        if target in line:
            line = line.replace(target,new1)
    for target in targets1:
        if target in line:
            line = line.replace(target,new1)
    f.write(line + "\n")
f.close()

但我认为必须有更好的方法,使用分隔符?此外,此解决方案不会在行的结尾和开头提取实例。有更好的程序员的想法吗?

预期输出:

a|b|c|d|e

1|不适用|不适用|不适用|不适用

1.2|2.6|NA|NA|1.7

我也尝试过使用 csv 模块和正则表达式:

import csv
import re

f=open('sample1_fixed.txt','wb')

with open('sample1.txt','rb') as inputfile:
    read=csv.reader(inputfile, delimiter='|')
    for row in read:
        text = row[1]
        text = re.sub(r'^\.$','NA',text)
        text = re.sub(r'^-$','NA',text)
        f.write(text + '\n')
f.close()

但这只允许我一次写一列,我不确定如何将它们全部放在输出中...

【问题讨论】:

  • 上述输入的预期输出是什么?
  • 你看过内置的csv模块吗?您可以指定自定义分隔符。
  • 一种方法是使用带有自定义分隔符 ='|' 的 csv.reader 和 replace_NAs() 的辅助函数。我只是注意到你想要替换 NA。

标签: python regex na csv


【解决方案1】:

csv.reader 与自定义分隔符='|'和replace_NAs 的帮助函数一起使用:

import csv

delim = '|'

def replace_NAs(row, NA_values=["", ".", "-"]):
    if x in NA_values:
        return "NA"
    else:
        return x

with open('infile') as csvfile:
    reader = csv.reader(csvfile, delimiter=delim)
    for row in reader:
        transformed_row = [replace_NAs(x) for x in row]
        print delim.join(transformed_row)

a|b|c|d|e
1|NA|NA|NA|NA
1.2|2.6|NA|NA|1.7

【讨论】:

  • 为什么第二次无法打印NA
  • @AvinashRaj:我只是注意到 OP 还希望在所有字段上替换 NA。完毕。为了清楚起见,编辑了标题。
猜你喜欢
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 2011-06-12
  • 2013-05-27
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
相关资源
最近更新 更多