首页 > 解决方案 > Python vs Shell:大文件操作的性能

问题描述

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

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

标签: pythonbashperformancecsv

解决方案


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

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

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

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

笔记:

  1. 默认情况下,read_csv 使用 C 解析器引擎来提高性能。C 解析器只能处理单个字符分隔符。如果您的 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) 

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


推荐阅读