【问题标题】:Read txt file with string and number columns读取带有字符串和数字列的 txt 文件
【发布时间】:2018-07-24 02:39:26
【问题描述】:

我有制表符分隔的文件(city-data.txt):

Alabama Montgomery  32.361538   -86.279118
Alaska  Juneau  58.301935   -134.41974

是否可以以某种方式将前两列读取为字符串,将后两列读取为浮点数?

我的输出应该是这样的:

[(Alabama,Montgomery,32.36,-86.28),
 (Alaska,Juneau,58.30,-134.42)]

我试过了:

mylist2=np.genfromtxt(r'city-data.txt', delimiter='\t',  dtype=("<S15","
<S15", float, float)).tolist()

这给了我字节类型的前两列:

[(b'Alabama', b'Montgomery', 32.361538, -86.279118),
 (b'Alaska', b'Juneau', 58.301935, -134.41974)]

我也试过了:

with open('city-data.txt') as f:
mylist = [tuple(i.strip().split('\t')) for i in f]

这给了我字符串类型的所有列:

[('Alabama', 'Montgomery', '32.361538', '-86.279118'),
 ('Alaska', 'Juneau', '58.301935', '-134.41974')]

我不知道如何实现我所需要的......

【问题讨论】:

  • 后一种方法有什么问题?只需根据需要将所有内容转换为 np.float64 即可。
  • 另外,对于初学者来说,更好的界面可能是pandas而不是numpy。
  • 只需读取所有内容,然后根据需要进行转换
  • 您是否尝试通过将最后两项转换为浮点数来添加到您的第二个解决方案? for item in line: if item.isdigit(): item = float(item); apend item to new container.有什么问题?
  • 在 Py3 中,默认的字符串类型是 unicode,numpy 标记为 U。 b'one' 是一个字节串,一个S dtype,这是Py2中的默认值。

标签: python string numpy format genfromtxt


【解决方案1】:

您可以使用 pandas read_csv 将文件内容读入数据框。然后将行转换为您使用 df.values.tolist() 指定的列表。

例子:

import pandas as pd

df = pd.read_csv(filename, sep="\t", header=None)

print(df.values.tolist())
#[['Alabama', 'Montgomery', 32.361538, -86.27911800000001],
# ['Alaska', 'Juneau', 58.301935, -134.41974]]

如果您需要它们作为元组,只需使用map():

print(map(tuple, df.values.tolist()))
#[('Alabama', 'Montgomery', 32.361538, -86.27911800000001),
# ('Alaska', 'Juneau', 58.301935, -134.41974)]

编辑

如果您想使用numpy,对现有代码的这种轻微修改应该可以工作。将文本字段的dtype 更改为"O":

mylist2=np.genfromtxt(filename delimiter='\t', dtype=("O","O", float, float)).tolist()
#[('Alabama', 'Montgomery', 32.361538, -86.279118),
# ('Alaska', 'Juneau', 58.301935, -134.41974)]

【讨论】:

  • 谢谢!似乎要容易得多。你知道如何去掉前两列中的引号吗?
  • @elenaby 我不确定你所说的引号是什么意思。前两列是字符串,因此当您显示它们时引号会出现。还可以试试我最近的编辑,它向您展示如何使用现有的numpy 代码。也许你会发现这更容易实现。
【解决方案2】:

另一种选择是使用 'U' dtype,它代表 unicode。

>>> import numpy as np
>>> mylist = np.genfromtxt('city-data.txt', delimiter='\t', dtype=('U10','U10',float,float)).tolist()
>>> mylist
[('Alabama', 'Montgomery', 32.361538, -86.279118), ('Alaska', 'Juneau', 58.301935, -134.41974)]

【讨论】:

    【解决方案3】:

    拆分一行后,通过尝试将项目转换为浮点数来创建新行,然后将新行附加到最终容器中。

    import io
    from pprint import pprint
    
    s = '''Alabama Montgomery  32.361538   -86.279118
    Alaska  Juneau  58.301935   -134.41974'''
    f = io.StringIO(s)
    stuff = []
    for line in f:
        line = line.strip()
        line = line.split()
        new_line = []
        for item in line:
            try:
                item = float(item)
            except ValueError as e:
                pass
            new_line.append(item)
        #print(f'line:{line}, new_line:{new_line}')
        stuff.append(new_line)
    pprint(stuff)  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      相关资源
      最近更新 更多