本文目录导读:

我来介绍几种拆分大文件的方法,包括命令行和Python脚本。
Linux/Mac 命令行split工具
按大小拆分
# 每个文件100MB split -b 100M large_file.txt part_ # 每个文件100MB,使用数字后缀 split -b 100M -d large_file.txt part_ # 每个文件100MB,数字后缀,指定后缀长度 split -b 100m -d -a 3 large_file.txt part_
按行数拆分
# 每10000行一个文件 split -l 10000 large_file.txt part_ # 每10000行,数字后缀 split -l 10000 -d large_file.txt part_
Python脚本拆分
按文件大小拆分
#!/usr/bin/env python3
# split_by_size.py
import os
def split_file_by_size(input_file, output_prefix, chunk_size_mb):
"""按指定大小拆分文件"""
chunk_size = chunk_size_mb * 1024 * 1024 # 转换为字节
file_count = 0
bytes_written = 0
with open(input_file, 'rb') as infile:
while True:
chunk = infile.read(chunk_size)
if not chunk:
break
output_file = f"{output_prefix}_{file_count:03d}.part"
with open(output_file, 'wb') as outfile:
outfile.write(chunk)
file_count += 1
bytes_written += len(chunk)
print(f"已创建: {output_file} ({len(chunk)} bytes)")
print(f"\n完成!共拆分 {file_count} 个文件,总大小 {bytes_written / 1024 / 1024:.2f} MB")
if __name__ == "__main__":
import sys
if len(sys.argv) != 4:
print("用法: python split_by_size.py <输入文件> <输出前缀> <大小MB>")
sys.exit(1)
split_file_by_size(sys.argv[1], sys.argv[2], int(sys.argv[3]))
按行数拆分
#!/usr/bin/env python3
# split_by_lines.py
def split_file_by_lines(input_file, output_prefix, lines_per_file):
"""按行数拆分文件"""
file_count = 0
line_count = 0
current_file = None
with open(input_file, 'r', encoding='utf-8') as infile:
for line in infile:
if line_count % lines_per_file == 0:
if current_file:
current_file.close()
output_file = f"{output_prefix}_{file_count:03d}.txt"
current_file = open(output_file, 'w', encoding='utf-8')
file_count += 1
print(f"正在写入: {output_file}")
current_file.write(line)
line_count += 1
if current_file:
current_file.close()
print(f"\n完成!共拆分 {file_count} 个文件,总行数 {line_count}")
if __name__ == "__main__":
import sys
if len(sys.argv) != 4:
print("用法: python split_by_lines.py <输入文件> <输出前缀> <行数>")
sys.exit(1)
split_file_by_lines(sys.argv[1], sys.argv[2], int(sys.argv[3]))
通用拆分工具(支持二进制和文本)
#!/usr/bin/env python3
# split_tool.py
import os
import argparse
from pathlib import Path
class FileSplitter:
def __init__(self, input_file, output_dir=None, buffer_size=1024*1024):
self.input_file = Path(input_file)
self.output_dir = output_dir or self.input_file.parent
self.buffer_size = buffer_size
self.file_size = self.input_file.stat().st_size
os.makedirs(self.output_dir, exist_ok=True)
def split_by_size(self, chunk_size_mb):
"""按大小拆分"""
chunk_size = chunk_size_mb * 1024 * 1024
parts = 0
with open(self.input_file, 'rb') as infile:
while True:
chunk = infile.read(chunk_size)
if not chunk:
break
output_file = self.output_dir / f"{self.input_file.stem}_part{parts:03d}{self.input_file.suffix}"
with open(output_file, 'wb') as outfile:
outfile.write(chunk)
parts += 1
print(f"拆分第 {parts} 部分: {output_file}")
return parts
def split_by_lines(self, lines_per_file):
"""按行拆分(文本文件)"""
parts = 0
line_count = 0
current_file = None
with open(self.input_file, 'r', encoding='utf-8') as infile:
for line in infile:
if line_count % lines_per_file == 0:
if current_file:
current_file.close()
output_file = self.output_dir / f"{self.input_file.stem}_part{parts:03d}.txt"
current_file = open(output_file, 'w', encoding='utf-8')
parts += 1
current_file.write(line)
line_count += 1
if current_file:
current_file.close()
return parts
def split_by_count(self, num_parts):
"""按数量均分"""
chunk_size = self.file_size // num_parts
parts = 0
with open(self.input_file, 'rb') as infile:
for i in range(num_parts):
if i == num_parts - 1: # 最后一个文件包含剩余所有内容
chunk = infile.read()
else:
chunk = infile.read(chunk_size)
if not chunk:
break
output_file = self.output_dir / f"{self.input_file.stem}_part{i:03d}{self.input_file.suffix}"
with open(output_file, 'wb') as outfile:
outfile.write(chunk)
parts += 1
return parts
# 命令行接口
def main():
parser = argparse.ArgumentParser(description='拆分大文件工具')
parser.add_argument('input', help='输入文件路径')
parser.add_argument('-o', '--output-dir', help='输出目录(默认:输入文件所在目录)')
parser.add_argument('-s', '--size', type=float, help='按大小拆分(MB)')
parser.add_argument('-l', '--lines', type=int, help='按行数拆分(文本文件)')
parser.add_argument('-n', '--num-parts', type=int, help='按数量均分')
args = parser.parse_args()
splitter = FileSplitter(args.input, args.output_dir)
if args.size:
parts = splitter.split_by_size(args.size)
print(f"按大小拆分完成,共 {parts} 个文件")
elif args.lines:
parts = splitter.split_by_lines(args.lines)
print(f"按行数拆分完成,共 {parts} 个文件")
elif args.num_parts:
parts = splitter.split_by_count(args.num_parts)
print(f"按数量拆分完成,共 {parts} 个文件")
else:
parser.print_help()
if __name__ == "__main__":
main()
使用示例
命令行使用
# Linux/Mac split -b 100m large_file.zip part_ split -l 10000 data.csv data_part_ # Python脚本使用 python split_tool.py large_file.zip -s 100 -o output_dir python split_tool.py data.csv -l 10000 -o output_dir python split_tool.py video.mp4 -n 5 -o output_dir
合并拆分的文件
#!/usr/bin/env python3
# merge_files.py
import os
import sys
def merge_files(input_pattern, output_file, file_ext='.part'):
"""合并拆分的文件"""
files = sorted([f for f in os.listdir('.') if f.startswith(input_pattern)])
files = [f for f in files if f.endswith(file_ext)]
with open(output_file, 'wb') as outfile:
for filename in files:
with open(filename, 'rb') as infile:
outfile.write(infile.read())
print(f"已合并: {filename}")
print(f"完成!输出文件: {output_file}")
if __name__ == "__main__":
if len(sys.argv) != 3:
print("用法: python merge_files.py <文件前缀> <输出文件>")
sys.exit(1)
merge_files(sys.argv[1], sys.argv[2])
注意事项
- 二进制文件使用
'rb'/'wb'模式 - 大文件建议使用缓冲区读取
- 内存管理避免一次性读取整个文件
- 错误处理添加异常检测
- 文件命名使用有意义的模式方便排序
- 磁盘空间确保有足够空间存放拆分后的文件
选择哪种方法取决于你的具体需求:
- 快速处理:用
split命令 - 需要控制:用 Python 脚本
- 复杂逻辑:用完整的 split_tool.py
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播