0

我有一个 TSV 文件,它由整数和一些错误数据组成,这些数据可能是浮点数或字符等。

这个想法是读取文件的内容并找出哪些是坏的(包含整数以外的数据)

一旦打开文件进行读取,就可以使用 readline 方法读取每一行。当然,readline() 方法将读取的每一行作为字符串返回,而不是它的组成数据类型。我的理解是,我可以pickle以某种方式使用该模块,通过将其表示为执行转储和加载方法的序列化版本来确保我保留原始数据类型。

问题是,我该怎么做?

通过读取每一行并对其进行腌制,这无济于事,因为 readline 默认情况下将其读取为字符串。因此,在酸洗时,它实际上只是将一个字符串酸洗成一个序列化的 python 对象表示,而 unpickling 只会将它作为一个字符串返回。因此,行中的实际数据(例如整数或字符)被表示为字符串,而不管。

所以我假设问题是,我如何以正确的方式腌制事物,或者如何处理文件的每一行以确保其数据类型得到维护?

4

3 回答 3

1

就好像你从泡菜中获取字符串一样,只需使用 '\t' 拆分字符串,然后使用

a = "0343523"
a.isdigit()
True

b = "934sjsspam"
b.isdigit()
False

还有另一种 unicodes 的方法也unicodes numeric check,所以只需使用它们

并维护数据类型

于 2012-08-12T21:52:03.040 回答
0

首先,解决酸洗的使用,您不会通过将每一行单独酸洗到文件中来解决它。ascii 格式按原样使用换行符,它只会制作一个凌乱的文件。通过简单地将整个数据腌制为数据结构,您可以保留有关整个事物的信息......例如:

from cPickle import loads, dumps
from types import IntType

line1 = [1, 2, 3]
line2 = [1.0, 'foo', 'bar']
line3 = [4, 5, 6]
pickled = dumps((line1, line2, line3))
# ((lp1\nI1\naI2\naI3\na(lp2\nF1\naS'foo'\np3\naS'bar'\np4\na(lp5\nI4\naI5\naI6\nat.
unpickled = loads(pickled)
# ([1, 2, 3], [1.0, 'foo', 'bar'], [4, 5, 6])

print all(isinstance(i, IntType) for i in line1)
# True
print all(isinstance(i, IntType) for i in line2)
# False

现在,当您将对象带回时,它们已被清晰地键入。

现在除了酸洗之外,如果您无法控制源文件的格式,您可以简单地测试每个制表符分隔的行:

line1 = '1\t2\t3'
line2 = '1.0\tfoo\tbar'
line3 = '4\t5\t6'

print all(map(str.isdigit, line1.split('\t')))
# True
print all(map(str.isdigit, line2.split('\t')))
# False
print all(map(str.isdigit, line3.split('\t')))
# True
于 2012-08-12T21:48:48.503 回答
0

TSV 文件已经丢失了所有类型信息。

如果使用了 pickle 模块来写出文件,您将能够轻松地 unpickle 它,但是看起来您只是可以读取损坏的文件,所以 pickle 在这里对您没有用处

您可以做的最好的事情是尝试将每个字段转换为int并在失败时处理异常

于 2012-08-12T22:03:14.347 回答