python - Python vs Shell:大文件操作的性能
问题描述
我有一个CSV文件,其中包含 50 列的 100 万条数据。我需要逐行阅读并创建一个包含几列的新 CSV 文件。
我需要知道执行文件操作哪个更快:Python 还是 shell 脚本?
解决方案
Shell 脚本非常适合简洁的文件系统操作以及通过管道将过滤器和命令行工具中现有功能的组合编写脚本。
当您的需求更大时——无论是在功能、健壮性、性能、效率等方面——然后你可以转向功能更全的语言,我认为 Python、Perl 和 Ruby 都是很棒的语言。不仅因为动态类型和不需要编译,还因为像pandas
, Fabric
, Capistrano
, Puppet
, 和许多其他工具让生活变得更轻松,通用编程语言。它们具有丰富多样的语句类型、大量内置数据结构,并且没有内置的假设或捷径可言。
使用 python,您可以将 .txt 或 .csv 文件导入到 DataFrame 中,这样操作起来更快更容易
import pandas as pd
df = pd.read_csv('/PathToFile.txt', sep = ',')
笔记:
默认情况下,read_csv 使用 C 解析器引擎来提高性能。C 解析器只能处理单个字符分隔符。如果您的 CSV 具有多字符分隔符,则需要修改代码以使用“python”引擎。您还可以传递正则表达式:
pd.read_csv(..., sep=r'\s*\|\s*', engine='python')
UnicodeDecodeError
当数据以一种编码格式存储但以另一种不兼容的编码格式读取时,就会发生这种情况。最常见的编码方案是“utf-8”和“latin-1”,您的数据很可能适合其中之一。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 ,出于小的、有针对性的目的,dict 可能会更快。如果这就是你所需要的,那么一定要使用字典!但是,如果您需要 DataFrame 的强大功能和奢华,那么 dict 是无可替代的。如果数据结构不首先满足你的需求,那么比较速度是没有意义的。
推荐阅读
- php - 获取用户自定义元数据值并在 WooCommerce 订单中更新它
- powershell - 获取所有 windows xp 和 server 2003 机器代码失败
- tensorflow-lite - 如何使用 c++ api 在 tflite 中获取权重?
- java - java中如何访问其他类的方法中的变量
- sql - 如何在条件相同的查询中获取相同查询的结果
- google-sheets - Sumif 公式为 Sumif 提供不同大小的数组参数
- java - 在现有的 spring-boot 应用程序中,在单独的线程中运行无限循环
- docker - 在 ubuntu 中限制在 docker 上运行的端口
- ruby - 使用“--retry”运行黄瓜时出现“无效选项”错误
- php - 我不断收到这些特殊字符符号:������