import os import time import mmap import math #######计算分块文件数 总行数/分块文件行数 向上取整 def get_fileNum(fileRow,blockfileRow): n = fileRow / blockfileRow num = math.ceil(n) return num ########计算分块文件行数 预设800m文件 800m/每一行字节数 得到每个块的行数 def get_blockfileRow(row_size): n = (1048576*800) / row_size num = int(n) return num #########计算文件总行数 根据用户输入的文件字节数/每一行字节数 def get_fileRow(file_size,row_size): n = file_size/row_size return n if __name__ == "__main__": file_size = 8511559356 row_size = 0 filename = r"F:\5hao2qu\2\disp_tab.txt" with open(filename,mode="r",encoding="utf-8") as file_obj: with mmap.mmap(file_obj.fileno(),length=0,access=mmap.ACCESS_READ) as mmap_obj: text = mmap_obj.readline() row_size = len(text) if(row_size): blockfileRow = get_blockfileRow(row_size) fileRow = get_fileRow(file_size,row_size) fileNum = get_fileNum(fileRow,blockfileRow) remainRow = fileRow - blockfileRow*(fileNum-1) #print("ok") with open(r"F:\5hao2qu\2\disp_tab.txt", mode="r", encoding="utf-8") as file_obj: with mmap.mmap(file_obj.fileno(), length=0, access=mmap.ACCESS_READ) as mmap_obj: for j in range(fileNum-1): a = "height{}.txt".format(j) with open(r"F:\5hao2qu\2\disp_tab.txt" + a, 'wb') as f: for i in range(int(blockfileRow)): text = mmap_obj.readline() f.write(text) a = "height{}.txt".format(fileNum-1) with open(r"F:\5hao2qu\2\disp_tab1.txt" + a, 'wb') as f: for i in range(int(remainRow)): text = mmap_obj.readline() f.write(text)
时间: 2024-04-21 10:23:17 浏览: 185
你的代码看起来是按照行将一个大型文本文件切割成多个小文件的代码。你计算了每个块的行数、总行数和分块文件数,并使用了 `mmap` 模块来进行文件内存映射,以便高效地读取文件内容。
不过,你的代码有一些问题。首先,在将切割后的小文件写入磁盘时,你使用了错误的文件路径。你在打开文件时添加了 `r"F:\5hao2qu\2\disp_tab.txt"`,但是在保存切割后的小文件时,你又在路径后面添加了一个文件名 `a`。这将导致文件保存到错误的路径,因为你在路径中包含了文件名。
此外,你在读取切割后的小文件时,没有按照之前使用的编码方式 `utf-8` 打开文件。因此,你需要在打开小文件时指定正确的编码方式,以便正确读取内容。
以下是修正后的代码:
```python
import os
import time
import mmap
import math
# 计算分块文件数:总行数/分块文件行数向上取整
def get_fileNum(fileRow, blockfileRow):
n = fileRow / blockfileRow
num = math.ceil(n)
return num
# 计算分块文件行数:预设800m文件 800m/每一行字节数 得到每个块的行数
def get_blockfileRow(row_size):
n = (1048576*800) / row_size
num = int(n)
return num
# 计算文件总行数:根据用户输入的文件字节数/每一行字节数
def get_fileRow(file_size, row_size):
n = file_size / row_size
return n
if __name__ == "__main__":
file_size = 8511559356
row_size = 0
filename = r"F:\5hao2qu\2\disp_tab.txt"
with open(filename, mode="r", encoding="utf-8") as file_obj:
with mmap.mmap(file_obj.fileno(), length=0, access=mmap.ACCESS_READ) as mmap_obj:
text = mmap_obj.readline()
row_size = len(text)
if row_size:
blockfileRow = get_blockfileRow(row_size)
fileRow = get_fileRow(file_size, row_size)
fileNum = get_fileNum(fileRow, blockfileRow)
remainRow = fileRow - blockfileRow * (fileNum - 1)
with open(filename, mode="r", encoding="utf-8") as file_obj:
with mmap.mmap(file_obj.fileno(), length=0, access=mmap.ACCESS_READ) as mmap_obj:
for j in range(fileNum - 1):
a = "height{}.txt".format(j)
with open(os.path.join(r"F:\5hao2qu\2", a), 'w', encoding="utf-8") as f:
for i in range(int(blockfileRow)):
text = mmap_obj.readline().decode("utf-8")
f.write(text)
a = "height{}.txt".format(fileNum - 1)
with open(os.path.join(r"F:\5hao2qu\2", a), 'w', encoding="utf-8") as f:
for i in range(int(remainRow)):
text = mmap_obj.readline().decode("utf-8")
f.write(text)
```
请注意,我对代码进行了一些修正:
- 在保存切割后的小文件时,使用 `os.path.join()` 函数来正确拼接文件路径。
- 在打开小文件时,使用 `encoding="utf-8"` 参数指定正确的编码方式。
- 在读取文件内容时,使用 `decode("utf-8")` 将字节解码为字符串。
这样修正后的代码应该能够正确地将大型文本文件切割成多个小文件。
阅读全文