【问题标题】:python: database formatted in txt e skip first line and first two columnspython:以txt格式格式化的数据库e跳过第一行和前两列
【发布时间】:2013-08-19 21:46:11
【问题描述】:

我有一个名为 DB.TXT 的普通 txt 数据库(分隔符 Tab 仅适用于数字),如下所示:

Date        Id  I   II  III IV  V
17-jan-13   aa  47  56  7   74  58
18-jan-13   ab  86  2   30  40  75
19-jan-13   ac  72  64  41  81  80
20-jan-13   ad  51  26  43  61  32
21-jan-13   ae  31  62  32  25  75
22-jan-13   af  60  83  18  35  5
23-jan-13   ag  29  8   47  12  69

我想知道 Python 中在读取文本文件时跳过第一行(Date、I、II、III、IV、V)和前两列(Date 和 Id)的代码。 (带数字的残数应该做加法和乘法等)

读取txt文件后会出现如下:

47 56 7 74 58

86 2 30 40 75

72 64 41 81 80

51 26 43 61 32

31 62 32 25 75

60 83 18 35 5

29 8 47 12 69

文件是txt格式,不是CSV。

【问题讨论】:

  • 您有一个制表符分隔值文件;一种 CSV 格式。

标签: python csv python-3.x


【解决方案1】:

如果你只打算对行进行计算,你可以简单地这样做:

with open("data.txt") as fh:
    fh.next()
    for line in fh:
        line = line.split()  # This split works equally well for tabs and other spaces
        do_something(line[2:])

如果您的需求更复杂,最好使用 Pandas 之类的库,它可以处理标题和标签列,以及正则表达式分隔符,让您可以轻松访问列:

import pandas
data = pandas.read_csv("blah.txt", sep="\s+", index_col=[0,1])
data.values   # array of values as requested
data.sum()    # sum of each column
data.product(axis=1)    # product of each row
etc... 

sep 是一个正则表达式,因为你说它并不总是\t,而index_col 是前两列的列标签。

【讨论】:

    【解决方案2】:

    “python 中的代码”相当广泛。使用 numpy,它是:

    In [21]: np.genfromtxt('db.txt',dtype=None,skip_header=1,usecols=range(2,6))
    Out[21]: 
    array([[47, 56,  7, 74],
           [86,  2, 30, 40],
           [72, 64, 41, 81],
           [51, 26, 43, 61],
           [31, 62, 32, 25],
           [60, 83, 18, 35],
           [29,  8, 47, 12]])
    

    【讨论】:

      【解决方案3】:

      使用csv module,要跳过第一行,只需调用next(f) 推进文件迭代器。要跳过前两行,您可以使用row = row[2:]

      import csv
      with open(filename, 'rb') as f:
          next(f)   # skip the first line
          for row in csv.reader(f, delimiter='\t'):
              row = row[2:]        # skip the first two columns
              row = map(int, row)  # map the strings to ints
      

      【讨论】:

      • 我用过这段代码: import csv def function(x,y,z,w,t): return (x-y) filename=("DB.txt") with open(filename,'r ') as f: next(f) for row in csv.reader(f,delimiter='\t'): row = row[2:] for line in f: numbers_str = line.split() numbers_int = [int( x) for x in numbers_str] print function(numbers_int[0],numbers_int[1],numbers_int[2],numbers_int[3] ,numbers_int[4])) 错误= int() 以 10 为底的无效文字:'17 -1 月 13 日'
      • 打印出row。您将看到它是一个项目列表。它本质上是numbers_str。不要使用for line in f`——csv.reader 已经为你迭代了f
      • 非常感谢:它有效。需要的人的代码是(对不起格式化): import csv def function(x,y,z,w,t): return (x+y+z+w+t) filename=('DB.TXT' ) with open(filename, 'r') as f: next(f) for row in csv.reader(f,delimiter='\t'): row = row[2:] numbers_int = [int(x) for x in row] print (function(numbers_int[0],numbers_int[1],numbers_int[2],numbers_int[3],numbers_int[4]))
      猜你喜欢
      • 2020-10-13
      • 2022-01-04
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 2017-06-06
      相关资源
      最近更新 更多