<blockquote>
<pre><code>FileNotFoundError: [Errno 2] No such file or directory: '.\\filesForAssignment1\\file1000'
</code></pre>
</blockquote>
<p>如果文件不存在,<code>w</code>模式会导致创建文件(如果文件不存在,则会被截断,<code>os.remove</code>在那里实际上并不有用),但是它确实希望中间目录存在</p>
<p>这意味着您应该在尝试创建文件之前确保文件(<code>'.\\filesForAssignment1</code>)的路径确实存在</p>
<pre class="lang-py prettyprint-override"><code>os.makedirs(os.path.dirname(fileName), exists_ok=True)
</code></pre>
<p>该怎么做,还是</p>
<pre class="lang-py prettyprint-override"><code>pathlib.Path(fileName).parent.mkdir(parents=True, exists_ok=True)
</code></pre>
<p>为了更现代一些</p>
<p>脚本中还有一系列其他小问题:</p>
<ul>
<li>主功能通常应该是“门控”的,这样就可以在不运行模块的情况下导入模块</li>
<li>显式关闭文件已不再受欢迎,因为它不可靠</li>
<li>在“文本”模式(默认)下打开文件时,应始终提供编码</li>
<li>pathlib很有趣,这样您就不必处理路径分隔符和所有那些废话了</li>
<li>除非需要处理这种情况,否则如果文件不存在,我只会让<code>open(fname, 'r')</code>出错</li>
</ul>
<p>以下是一个我认为应该稍微改进的版本:</p>
<pre class="lang-py prettyprint-override"><code>import pathlib
import random
import os
import time
def fillFile(fileSize, fileName):
with fileName.open('w', encoding='utf-8') as f:
for i in range(fileSize):
r = random.randint(0,fileSize+1000)
f.write(f"{r}\n")
def readFile(fileName):
with fileName.open(encoding='utf-8') as f:
return [int(line) for line in f]
OUT_DIR = pathlib.Path.cwd().joinpath("filesForAssignment1")
FILE_SIZES = [1000, 5000, 10000, 25000, 50000, 100000, 200000]
def mainForFiles():
# Dosyaları oluştur
OUT_DIR.mkdir(parents=True, exist_ok=True) # make sure the directory exists
statFilePath = pathlib.Path("fileStats.txt")
with statFilePath.open('w', encoding='utf-8') as statFile:
statFile.write("fillFile")
print("WRITING TO FILES")
for i in FILE_SIZES:
start = time.time()
fillFile(i, OUT_DIR.joinpath(f'file{i}'))
finish = time.time()
statFile.write(f" {finish-start}")
print(f"File Size = {i} Write Time = {finish-start})")
statFile.write("\n")
print("READING FILES")
statFile.write("readFile")
for i in FILE_SIZES:
f = OUT_DIR.joinpath(f'file{i}')
# Dosyayı oku
start = time.time()
alist = readFile(f)
finish = time.time()
statFile.write(f" {finish-start}")
print (f"File Size = {i} Dosya Okuma Zamanı = {finish-start}")
statFile.write("\n")
if __name__ == '__main__':
mainForFiles()
</code></pre>