【问题标题】:Python vs Shell: Performance for large file manipulationPython vs Shell:大文件操作的性能
【发布时间】:2020-09-06 14:54:42
【问题描述】:

我有一个 CSV 文件,其中包含 50 列的 100 万条数据。我需要逐行阅读并创建一个包含几列的新 CSV 文件。

我需要知道执行文件操作哪个更快:Python 还是 shell 脚本?

【问题讨论】:

  • 我建议你使用 AWK 而不是 python/shell
  • 如果它是非平凡的 CSV(带逗号的引用字段等),请考虑 csvkit 包中的 csvcut。 (这是用python fwiw编写的)。
  • @rid 虽然调用其他工具是使用 shell 的常用方法,但这不是强制性的。在 bash(甚至是普通的 POSIX sh)中,你有很多能够完成这项工作的内置插件,尽管速度很慢。
  • 答案很大程度上取决于 "with few columns" 的含义。请具体说明具体要求。另外,描述您的 csv 文件。不加引号是不是很简单?
  • AWK 在 10 秒内解决此案。谢谢@jv96

标签: python bash performance csv


【解决方案1】:

Shell 脚本非常适合简洁的文件系统操作以及通过管道将过滤器和命令行工具中现有功能的组合编写脚本。

当您的需求更大时——无论是在功能、健壮性、性能、效率等方面——然后您可以转向功能更全面的语言,我认为 Python、Perl 和 Ruby 都是很棒的语言。不仅因为动态类型和不需要编译,还因为像pandasFabricCapistranoPuppet 和许多其他工具,它们让生活变得更轻松,一般——目的编程语言。它们具有丰富多样的语句类型、众多内置数据结构,并且没有内置的假设或捷径可言。

使用 python,您可以将 .txt 或 .csv 文件导入到 DataFrame 中,这样操作起来更快更容易

import pandas as pd
df = pd.read_csv('/PathToFile.txt', sep = ',')

注释:

  1. 默认情况下,read_csv 使用 C 解析器引擎来提高性能。 C parser 只能处理单个字符的分隔符。如果您的 CSV 有 多字符分隔符,您需要将代码修改为 使用“python”引擎。也可以传递正则表达式:pd.read_csv(..., sep=r'\s*\|\s*', engine='python')

  2. UnicodeDecodeError 发生在数据以一种编码存储时 格式,但以不同的、不兼容的格式读取。最常见的 编码方案是“utf-8”和“latin-1”,您的数据很可能 适合其中之一。

  3. header=False 指定 CSV 中的第一行是数据行 而不是标题行,并且 names=[...] 允许您指定 分配给 DataFrame 时的列名列表 已创建。

使用 Python 的内置 csv 模块替代 pandas 库:

import csv
from pprint import pprint
with open('foo.csv', 'rb') as f:
    reader = csv.reader(f)
    headers = reader.next()
    column = {h:[] for h in headers}
    for row in reader:
        for h, v in zip(headers, row):
            column[h].append(v)
    pprint(column)    # Pretty printer

您可以使用的另一种解决方案csv.DictReader

reader = csv.DictReader(open('foo.csv'))
dictobj = next(reader) 

但我建议您使用pandas,对于一个小的、有针对性的目的,dict 可能会更快。如果这就是你所需要的,那么一定要使用字典!但是,如果您需要 DataFrame 的强大功能和奢华,那么 dict 是无可替代的。如果数据结构不能首先满足你的需求,那么比较速度是没有意义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多