Python:我的脚本不允许我创建大文件
我正在制作一个小python脚本,它将创建各种形状和大小的随机文件,但它不允许我创建大文件。我希望能够创建大小高达8GB的文件,我知道这需要很长时间,但我不担心这一点 问题是Python2.7无法处理我为了创建填充文件的随机文本而抛出的大量数字 我的代码的目的是创建具有随机名称和扩展名的文件,用随机数量的垃圾文本填充文件并保存文件。在我关闭命令行窗口之前,它将一直重复此操作Python:我的脚本不允许我创建大文件,python,python-2.7,Python,Python 2.7,我正在制作一个小python脚本,它将创建各种形状和大小的随机文件,但它不允许我创建大文件。我希望能够创建大小高达8GB的文件,我知道这需要很长时间,但我不担心这一点 问题是Python2.7无法处理我为了创建填充文件的随机文本而抛出的大量数字 我的代码的目的是创建具有随机名称和扩展名的文件,用随机数量的垃圾文本填充文件并保存文件。在我关闭命令行窗口之前,它将一直重复此操作 import os import string import random ext = ['.zip', '.exe'
import os
import string
import random
ext = ['.zip', '.exe', '.txt', '.pdf', '.msi', '.rar', '.jpg', '.png', '.html', '.iso']
min = raw_input("Enter a minimum file size eg: 112 (meaning 112 bytes): ")
minInt = int(min)
max = raw_input("Enter a maximum file size: ")
maxInt = int(max)
def name_generator(chars=string.ascii_letters + string.digits):
return ''.join(random.choice(chars) for x in range(random.randint(1,10)))
def text_generator(chars=string.printable + string.whitespace):
return ''.join(random.choice(chars) for x in range(random.randint(minInt,maxInt)))
def main():
fileName = name_generator()
extension = random.choice(ext)
file = fileName + extension
print 'Creating ==> ' + file
fileHandle = open ( file, 'w' )
fileHandle.write ( text_generator() )
fileHandle.close()
print file + ' ==> Was born!'
while 1:
main()
任何帮助都将不胜感激 问题不在于python不能处理大量数据。它可以 但是,您试图一次将整个文件内容放入内存中—您可能没有足够的RAM来执行此操作,而且无论如何也不想执行此操作 解决方案是使用生成器并将数据分块写入:
def text_generator(chars=string.printable + string.whitespace):
return (random.choice(chars) for x in range(random.randint(minInt,maxInt))
for char in text_generator():
fileHandle.write(char)
但这仍然是非常低效的-您希望以块(例如10kb)而不是单个字节的形式写入数据。问题并不是python无法处理大量数据。它可以 但是,您试图一次将整个文件内容放入内存中—您可能没有足够的RAM来执行此操作,而且无论如何也不想执行此操作 解决方案是使用生成器并将数据分块写入:
def text_generator(chars=string.printable + string.whitespace):
return (random.choice(chars) for x in range(random.randint(minInt,maxInt))
for char in text_generator():
fileHandle.write(char)
但是,这仍然是非常低效的-您希望以块(例如10kb)而不是单个字节的形式写入数据。根据以下说明将其设置为惰性:
import string
import random
from itertools import islice
chars = string.printable + string.whitespace
# make infinite generator of random chars
random_chars = iter(lambda: random.choice(chars), '')
with open('output_file','w', buffering=102400) as fout:
fout.writelines(islice(random_chars, 1000000)) # write 'n' many
按照以下步骤将其设置为惰性:
import string
import random
from itertools import islice
chars = string.printable + string.whitespace
# make infinite generator of random chars
random_chars = iter(lambda: random.choice(chars), '')
with open('output_file','w', buffering=102400) as fout:
fout.writelines(islice(random_chars, 1000000)) # write 'n' many
关于性能的评论:您可以通过使用生成随机字节并将其转换为输入字符范围来改进性能:
import os
import string
def generate_text(size, chars=string.printable+string.whitespace):
# make translation table from 0..255 to chars[0..len(chars)-1]
all_chars = string.maketrans('', '')
assert 0 < len(chars) <= len(all_chars)
result_chars = ''.join(chars[b % len(chars)] for b in range(len(all_chars)))
# generate `size` random bytes and translate them into given `chars`
return os.urandom(size).translate(string.maketrans(all_chars, result_chars))
导入操作系统
导入字符串
def generate_text(大小,字符=string.printable+string.whitespace):
#将转换表从0..255转换为字符[0..len(字符)-1]
all_chars=string.maketrans(“”,“”)
assert 0
import os
import string
def generate_text(size, chars=string.printable+string.whitespace):
# make translation table from 0..255 to chars[0..len(chars)-1]
all_chars = string.maketrans('', '')
assert 0 < len(chars) <= len(all_chars)
result_chars = ''.join(chars[b % len(chars)] for b in range(len(all_chars)))
# generate `size` random bytes and translate them into given `chars`
return os.urandom(size).translate(string.maketrans(all_chars, result_chars))
导入操作系统
导入字符串
def generate_text(大小,字符=string.printable+string.whitespace):
#将转换表从0..255转换为字符[0..len(字符)-1]
all_chars=string.maketrans(“”,“”)
断言0return“”。加入(范围内x的随机选择(chars)(random.random.randoint(minInt,maxInt))
注意:allstring.whitespace
字符也在string.printable
i.e。,whitespace
char有更多的机会出现在结果中。您看到了什么错误?这是您的错误:return'。加入(random.choice(chars)代表范围内的x(random.randint(minInt,maxInt))
注意:所有string。whitespace
字符也在string.printable
中,即。,whitespace
char有更多的机会出现在结果中。用10KB块写会更有意义,有没有一个页面可以链接到我,解释如何做到这一点?用10KB块写会更有意义,有没有一个页面可以链接到我,解释如何做到这一点?它创建了一个无限多的随机字符,并写'n'许多到一个文件的缓冲区为100kb…我添加了你的代码,它的工作!现在仍在创建一个文件,但我右键单击了“属性”,到目前为止它的大小为288MB,这比我以前创建的文件大得多!只有上帝知道它什么时候会停止!它创建了无限多个随机字符,并将“n”多个字符写入一个缓冲区为100kb的文件中……我添加了你的代码,它工作正常!现在仍在创建一个文件,但我右键单击了“属性”,到目前为止它的大小为288MB,这比我以前创建的文件大得多!只有上帝知道它什么时候会停止!