【问题标题】:how to read a comma sep value with .txt extension into python as an array?如何将带有.txt扩展名的逗号sep值作为数组读入python?
【发布时间】:2013-02-05 16:34:49
【问题描述】:

我是生物学家,对 Python 非常陌生,在此之前,我学了一点 R。

所以我有一个非常大的文本文件(3 GB,在 R 中太大而无法处理),所有值都用逗号分隔,但扩展名是 .txt(我不知道这是否是必要的信息)。我想做的是:

将它作为一个对象读入python,相当于R中的数据框, 摆脱中间的列 减小对象的大小 写成txt文件

把剩下的带到 R.

如果你能帮助我,我会很高兴。 谢谢

【问题讨论】:

  • 我推荐CSV module
  • 对我来说,这看起来更像是 perl 甚至 sed 的工作......如果没有看到至少一行并确切了解删除内部列的规则是什么,很难说......
  • R 中 sqldf 包中的 read.csv.sql 可能有用:code.google.com/p/sqldf。您可以使用 SQL 仅从 csv 中提取必填字段。我有一些大文件的运气,但没有你那么大。
  • 或 unix 命令行:cut -f 1-3,8-12 -d, < bigfile.txt >smallerfile.txt(如果引号中有逗号,可能会失败)

标签: python r


【解决方案1】:

这将占用最少的内存,因为它不会一次加载整个文件。

import csv
with open('in.txt', 'rb') f_in, open('out.csv', 'wb') as f_out:
    reader = csv.reader(f_in)
    writer = csv.writer(f_out)
    for row in reader:
        # keep first two columns and last three columns
        writer.writerow(row[:2] + row[-3:])

注意:如果使用 Python 3,请将文件模式分别更改为 'r''w'

【讨论】:

  • 对于python3,您还必须为输出文件添加newline=''
  • 感谢您的回答。我在 Mac OS x 10.6 上使用带有 EPD 免费分发的 python 2.7。这在最后一行给了我一个错误,说这是一个语法错误,但我不知道它有什么问题......这里说的是:文件“”,第 5 行 writer.writerow(row[:2] + [-3:]) ^
  • @user2091290:哎呀。那应该是writer.writerow(row[:2] + row[-3:])。我忘记了对该行的第二次引用。
【解决方案2】:

根据CRAN(新功能和错误修复重新:开发)新的开发版本 3.0.0 应该允许 R 使用页面文件/交换。在 Windows 中,您需要将 R_MAX_MEM_SIZE 设置为适当大的值。

【讨论】:

  • 这个通用的 CRAN 链接不是很有帮助,你能提供一个更具体的链接吗?
  • 我的操作系统是 Mac OS X 10.6.8 我试图加载该文本文件的简化版本 (~400 MB),但 R 被冻结了。
  • 我推荐的是 R 的开发版本。它不是一个“稳定”的版本,所以一些包可能还不能用于它。但是,它似乎应该能够加载您的初始文件,您可以对其进行修改,然后将其保存为 CSV,然后将其加载回 R 的稳定版本。然后您无需学习新技能.当然,这都是我根据他们声称 3.0.0 可以做什么的推测。 OS X 的链接在这里:r.research.att.com/R-devel-leopard.pkg
  • 呃...但我不知道 Mac 版本是如何工作的。上面列出的内容是一个框架......他们还列出了 GUI 的单独下载。 64 位 r.research.att.com/R-GUI-6443-3.0-leopard-Leopard64.dmg 和 32 位 r.research.att.com/R-GUI-6443-3.0-leopard-Leopard.dmg。所有这些都可以在r.research.att.com 获得。也许 Mac 本地人可以破译。
【解决方案3】:

如果您坚持使用预处理步骤,使用 linux 命令工具是一个非常好的快速选择。如果你使用 Linux,这些工具已经安装好了,在 Windows 下你需要先安装 MinGW 或 Cygwin。 This SO question 已经提供了一些不错的指针。本质上,您使用awk 工具来迭代处理文本文件,同时创建一个输出文本文件。复制我链接的 SO 问题的已接受答案:

awk -F "," '{ split ($8,array," "); sub ("\"","",array[1]); sub (NR,"",$0); sub (",","",$0); print $0 > array[1] }' file.txt 

这会读取文件,抓取第八列,然后将其转储到文件中。详情请查看答案。

【讨论】:

    【解决方案4】:

    没有必要先进入python。你的问题看起来很像this question。标记为正确答案的答案迭代地读取大文件,并创建一个新的较小的文件。其他好的替代方案是使用sqlitesqdf 包,或使用ff 包。最后一种方法效果特别好,因为与行数相比,列数很小。

    【讨论】:

      【解决方案5】:

      我不熟悉 r 数据框,但 pandas 提供 helpers 将 csv 读入 pandas 数据框:

      from pandas import read_csv    
      df = read_csv('yourfile.txt')
      print df
      print df['Line']
      

      如果这不是您需要的,您可以使用csv 模块将 csv 的每一行作为 python 列表进行迭代,并将其放入您想要的任何数据结构中。

      【讨论】:

      • 在不迭代的情况下读取整个文件可能也会占用太多内存。
      • 感谢您的回答。我使用Mac OS 10.6,最近我通过安装几个包的EPD免费分发+ python2.7解决了计算机(OS)-python版本模块之间的兼容性问题我不知道pandas是否与我所拥有的兼容。我现在去看看。
      猜你喜欢
      • 1970-01-01
      • 2023-02-02
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多