【问题标题】:Parsing a tab delimited file into separate lists or strings将制表符分隔的文件解析为单独的列表或字符串
【发布时间】:2011-11-28 03:43:35
【问题描述】:

我正在尝试使用包含两列名称和年龄的制表符分隔文件,其内容如下:

'姓名\tAge\nMark\t32\nMatt\t29\nJohn\t67\nJason\t45\nMatt\t12\nFrank\t11\nFrank\t34\nFrank\t65\nFrank\t78\n'

然后简单地创建两个列表,一个带有名称(称为名称,没有标题),另一个带有年龄(称为年龄,但列表中没有年龄)。

【问题讨论】:

    标签: python parsing tabs delimited


    【解决方案1】:

    marvin 的回答,但没有两次阅读整个文件

    data = [ (x[0],x[1]) for x in csv.reader(open(filename,'r'),delimiter='\t')]
    

    如果你可以接受它是元组,而不是两个列表

    您仍然可以一次将数据读入两个列表,这将是 unubtu 的答案

    【讨论】:

      【解决方案2】:

      Unutbu 的答案使用列表理解压缩:

      names = [x[0] for x in csv.reader(open(filename,'r'),delimiter='\t')]
      ages = [x[1] for x in csv.reader(open(filename,'r'),delimiter='\t')]
      

      【讨论】:

        【解决方案3】:

        制表符分隔的数据在csv 模块的域内:

        >>> corpus = 'Name\tAge\nMark\t32\nMatt\t29\nJohn\t67\nJason\t45\nMatt\t12\nFrank\t11\nFrank\t34\nFrank\t65\nFrank\t78\n'
        >>> import StringIO
        >>> infile = StringIO.StringIO(corpus)
        

        假装infile 只是一个普通的file...

        >>> import csv
        >>> r = csv.DictReader(infile, 
        ...                    dialect=csv.Sniffer().sniff(infile.read(1000)))
        >>> infile.seek(0)
        

        您甚至不必告诉 csv 模块有关标题和分隔符格式的信息,它会自行解决

        >>> names, ages = [],[]
        >>> for row in r:
        ...     names.append(row['Name'])
        ...     ages.append(row['Age'])
        ... 
        >>> names
        ['Mark', 'Matt', 'John', 'Jason', 'Matt', 'Frank', 'Frank', 'Frank', 'Frank']
        >>> ages
        ['32', '29', '67', '45', '12', '11', '34', '65', '78']
        >>> 
        

        【讨论】:

          【解决方案4】:

          使用csv module,您可以执行以下操作:

          import csv
          
          names=[]
          ages=[]
          with open('data.csv','r') as f:
              next(f) # skip headings
              reader=csv.reader(f,delimiter='\t')
              for name,age in reader:
                  names.append(name)
                  ages.append(age) 
          
          print(names)
          # ('Mark', 'Matt', 'John', 'Jason', 'Matt', 'Frank', 'Frank', 'Frank', 'Frank')
          print(ages)
          # ('32', '29', '67', '45', '12', '11', '34', '65', '78')
          

          【讨论】:

            【解决方案5】:

            我会使用字符串的splitsplitlines 方法:

            names = []
            ages = []
            for name_age in input.splitlines():
                name, age = name_age.strip().split("\t")
                names.append(name)
                ages.append(age)
            

            如果你要解析更复杂的格式,我建议使用the csv module,它也可以处理tsv……但这里似乎有点矫枉过正。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-09-20
              • 1970-01-01
              • 1970-01-01
              • 2011-03-18
              相关资源
              最近更新 更多