【问题标题】:Python writes 0 to the filePython 将 0 写入文件
【发布时间】:2017-09-25 21:27:04
【问题描述】:
import os


fileHandle = open('booksNames.txt', 'r+')

def getData():
    data = os.system('dir /b /a /s *.pdf *.epub *.mobi')
    fileHandle.writelines(str(data))

fileHandle.close()

我正在尝试将 os.system 函数返回的数据写入文件。但唯一写入文件的是 0。以下是我尝试过的其他一些变体。

import os

fileHandle = open('booksNames.txt', 'r+')

getData = lambda:os.system('dir /b /a /s *.pdf *.epub *.mobi')
data = getData()

fileHandle.writelines(str(data))
fileHandle.close()

在输出窗口中,它提供了完美的输出,但在写入文本文件时它会写入零。我也尝试过使用 return 但没有用。请帮忙。

【问题讨论】:

  • 第一个变体至少包含两个错误:1)'r+'不正确; 'r' 用于读取(仅)和 'w' 用于写入(这是您想要的)。 2) GetData 函数永远不会被调用。
  • @SurestTexas 'r+' 从文件开头开始读/写,所以很好
  • os.system 不返回执行的命令行打印的输出。它返回进程的退出状态,即 0。
  • @user2357112,当您添加正确的呼叫时,这应该是一个答案
  • @SurestTexas: r+ 正在打开读/写。

标签: python windows file text io


【解决方案1】:

对于 Windows(我假设您使用的是 Windows,因为您使用的是“dir”命令,而不是 Unix/Linux 的“ls”):

只需让命令完成工作。

os.system('dir /b /a /s *.pdf *.epub *.mobi >> booksNames.txt')

使用“>>”将追加到任何现有文件。只需使用 '>' 写入一个新文件。

我喜欢使用子进程的其他解决方案,但由于这是特定于操作系统的,我认为这更简单。

【讨论】:

  • with 是管理关闭文件的更好方法,但它对 0 没有任何作用。
【解决方案2】:

使用subprocess 模块。方法有很多,但最简单的是:

>>> import subprocess
>>> with open('out.txt','w') as f:
...     subprocess.call(['dir','/b','/a','/s','*.pdf','*.epub','*.mobi'],stdout=f,stderr=f,shell=True)
...
0

零是退出代码,但内容将在out.txt中。

【讨论】:

  • 文件系统编码为 UTF-16LE,但如果没有附加控制台,则 cmd.exe 使用控制台的当前输出代码页(默认为 OEM)或 ANSI 对 dir 输出进行编码。如果所有文件名都可以在 OEM 或 ANSI 代码页中编码,那就没问题了。但否则你将不得不删除shell=True;执行'cmd.exe /u /c "{}"'.format(cmdline);并将输出解码为 UTF-16LE。
  • 另外,一般来说,您不应该使用带有shell=True 的列表。 subprocess.list2cmdline 不是为 cmd shell 编写的;它是为 MSVC argv 解析而写的。
猜你喜欢
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 2014-07-24
  • 2020-08-26
  • 2015-05-29
  • 1970-01-01
相关资源
最近更新 更多