python - Pandas read_fwf 没有加载文件的全部内容

标签 python parsing pandas fixed-width

我有一个相当大的固定宽度文件(约 3000 万行,4GB),当我尝试使用 pandas read_fwf() 创建 DataFrame 时,它​​只加载了文件的一部分,我很好奇是否有人有过这个解析器没有读取文件的全部内容的类似问题。

import pandas as pd

file_name = r"C:\....\file.txt"
fwidths = [3,7,9,11,51,51]

df = read_fwf(file_name, widths = fwidths, names = [col0, col1, col2, col3, col4, col5])
print df.shape #<30M

如果我天真地使用 read_csv() 将文件读入 1 列,则所有文件都被读入内存并且没有数据丢失。

import pandas as pd

file_name = r"C:\....\file.txt"

df = read_csv(file_name, delimiter = "|", names = [col0]) #arbitrary delimiter (the file doesn't include pipes)
print df.shape #~30M

当然,在没有看到文件的内容或格式的情况下,它可能与我这边的某些内容有关,但想看看过去是否有其他人对此有过任何问题。我进行了健全性检查并测试了文件深处的几行,它们的格式似乎都正确(当我能够使用相同的规范将其拉入 Talend 的 Oracle 数据库时进一步验证)。

如果有人有任何想法,请告诉我,当我开始开发分析时,最好通过 Python 运行所有内容,而不是来回走动。

最佳答案

输入文件的几行将有助于查看日期的外观。不过,我生成了一些与您拥有的格式(我认为)相似的随机文件,并将 pd.read_fwf 应用到其中。这是生成和阅读代码:

从随机导入随机

import pandas as pd


file_name = r"/tmp/file.txt"

lines_no = int(30e6)

with open(file_name, 'w') as f:
    for i in range(lines_no):
        if i%int(1e5) == 0:
            print("Writing progress: {:0.1f}%"
                    .format(float(i) / float(lines_no)*100), end='\r')
        f.write(" ".join(["{:<10.8f}".format(random()*10) for v in range(6)])+"\n")


print("File created. Now read it using pd.read_fwf ...")

fwidths = [11,11,11,11,11,11]

df = pd.read_fwf(file_name, widths = fwidths,
               names = ['col0', 'col1', 'col2', 'col3', 'col4', 'col5'])


#print(df)

print(df.shape) #<30M

所以在这种情况下,它接缝工作正常。我使用 Python 3.4、Ubuntu 14.04 x64 和 pandas 0.15.1。创建文件并使用 pd.read_fwf 读取它需要一段时间。但它似乎有效,至少对我和我的设置而言。

结果是:(30000000, 6)

创建的示例文件:

7.83905215 9.64128377 9.64105762 8.25477816 7.31239330 2.23281189
8.55574419 9.08541874 9.43144800 5.18010536 9.06135038 2.02270145
7.09596172 7.17842495 9.95050576 4.98381816 1.36314390 5.47905083
6.63270922 4.42571036 2.54911162 4.81059164 2.31962024 0.85531626
2.01521946 6.50660619 8.85352934 0.54010559 7.28895079 7.69120905

关于python - Pandas read_fwf 没有加载文件的全部内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27416031/

相关文章:

java - 不将数组从 json 解析为 android java

python - 将 json 对象转换为 python 中的数据框

python - 在 Pandas groupby 上使用 value_counts 时如何忽略空系列?

python - 使用Python类将数据写入xls

python - 如何在 SublimeREPL 中停止输入

ruby - 从 href html 标签中使用 ruby​​ 中的 nokogiri 提取链接(URL)?

java - 如何使用 java 检查 .csv 中的重复记录

python - 如何使用 Python Pandas 按列合并集合?

python - 在Python中查找函数的文件名和文件路径

python - 在评估等同于 2 个函数调用的结果时,寻找一种方法(最好是在 Python 中)获取第二个参数值