读取混合项目的文件并保留其数据类型

时间:2012-08-12 21:28:39

标签: python

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

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

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

问题是,我该怎么做?

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

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

3 个答案:

答案 0 :(得分:1)

好像从pickle获取字符串,只需使用'\ t'拆分字符串,然后使用

a = "0343523"
a.isdigit()
True

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

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

并维护数据类型

答案 1 :(得分: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

答案 2 :(得分:0)

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

如果使用pickle模块写出文件,你就可以轻松地将其解开,但是看起来你只是想读取损坏的文件,所以pickle对你来说没什么用处

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