【问题标题】:Python: Parsing a specific column (from scratch, no "import csv") in tab-separated-filePython:在制表符分隔文件中解析特定列(从头开始,没有“导入 csv”)
【发布时间】:2018-01-25 02:38:24
【问题描述】:

我已经编写了一些可以将字符串解析为元组的代码:

s = '30M3I5X'
l = []
num = ""
for c in s:
  if c in '0123456789':
     num = num + c
     print(num)
  else:
     l.append([int(num), c])
  num = ""

print(l)

即;

'30M3I5X' 

变成

[[30, 'M'], [3, 'I'], [5, 'X']]

那部分工作得很好。但是,我现在正在努力弄清楚如何从制表符分隔值文件的第一列中获取值以成为我的新“s”。 IE。;对于一个看起来像这样的文件:

# File Example #
30M3I45M2I20M   I:AAC-I:TC
50M3X35M2I20M   X:TCC-I:AG

会以某种方式合并一个循环以仅获取第一列,从而产生

[[30, 'M'],[3, 'I'],[45, 'M'],[2, 'I'],[20, 'M']]
[[50, 'M'],[3, 'X'],[35, 'M'],[2, 'I'],[20, 'M']]

无需使用

import csv 

或任何其他模块。

非常感谢!

【问题讨论】:

  • 你不使用任何模块的原因是什么?
  • 我是 Python 新手,想看看你会如何从头开始做这样的事情。我对使用模块没有任何偏见——它们可以节省大量时间。不幸的是,有时在 PyCharm 中,编辑器会在其中抛出“未使用的导入语句”,我还没有完全弄清楚原因。

标签: python csv parsing multiple-columns


【解决方案1】:

只是open文件的路径并遍历记录?

def fx(s):    
    l=[]  
    num=""  
    for c in s:  
        if c in '0123456789':  
           num=num+c  
        print(num)  
        else:  
           l.append([int(num), c])  
      num=""  
    return l

with open(fp) as f:
  for record in f:
      s, _ = record.split('\t')
      l = fx(s)
      # process l here ...

【讨论】:

    【解决方案2】:

    以下代码将满足您的目的

    rows = ['30M3I45M2I20M   I:AAC-I:TC', '30M3I45M2I20M   I:AAC-I:TC']
    
    for row in rows:
        words = row.split('  ')
        print(words[0])
        l = []
        num = ""
        for c in words[0]:
            if c in '0123456789':
                 num = num + c
            else:
                l.append([int(num), c])
    
        print(l)
    

    根据需要将 row.split(' ') 更改为 ('\t') 或任何其他分隔符

    【讨论】:

    • 这可行,但最终结果只是文件中最后一行的正确数组。
    【解决方案3】:

    这样的事情应该可以满足您的需求。

    filename = r'\path\to\your\file.txt'
    with open(filename,'r') as input:
        for row in input:
            elements = row.split()
            # processing goes here  
    

    elements[0] 包含作为文件中第一列数据的字符串。

    编辑:

    最终得到处理数据列表的列表:

    result = []
    filename = r'\path\to\your\file.txt'
    with open(filename,'r') as input:
        for row in input:
            elements = row.split()
            # processing goes here
            result.append(l) # l is the result of your processing
    

    【讨论】:

    • 这很有帮助,但随之而来的问题是,如果处理包含在循环中,那么我们最终会得到一个数组,其中包含所有数组作为一个大数组- - 行之间没有区别。
    • 如果处理包含在循环之外,则结果是正确的数组,但仅适用于文件的最后一行。
    【解决方案4】:

    所以这就是最终对我有用的东西——从每个人那里收集了一些零碎的东西,谢谢大家!

    注意:我知道这有点冗长,但由于我是新手,它可以帮助我跟踪所有内容:)

    #Defining the parser function
    
    def col1parser(col1):
    l = []
    num = ""
    for c in col1:
        if c in '0123456789':
            num = num + c
        else:
            l.append([int(num), c])
            num = ""
    print(l)
    
    
    #Open file, run function on column1
    filename = r'filepath.txt'
    with open(filename,'r') as input:
        for row in input:
            elements = row.split()
            col1 = elements[0]
            l = col1parser(col1)
    

    【讨论】:

      猜你喜欢
      • 2011-12-12
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      • 2013-10-16
      • 2015-02-14
      相关资源
      最近更新 更多