Python 读取空格分隔文件行作为单独行
这是在Windows Server 2008 R2上遇到的问题。我有一个输入文件,每行一个输入。有些输入中包含空格。我尝试使用下面这段简单的代码,但它把每个单词都分开了,而不是按行分开。我应该得到208个新文件夹(并且去掉空格),但最后我得到了230个文件夹,这就是问题所在。我需要修改什么才能解决这个问题呢?
import os
f = open("out.txt", "r")
os.chdir("base location")
for line in f:
os.system("mkdir " + line.strip())
(举个例子,“Download Samples”在out.txt中是一行,但这个脚本却创建了两个文件夹,“Download”和“Samples”。)
为了更清楚,我有一个包含208个名字的列表,每行一个。有些名字中有空格。我需要在base location
目录下为每一行创建一个文件夹。上面的脚本是按单词创建文件夹,而不是按行创建。这就是我需要解决的问题。
6 个回答
编辑:这是解决办法
import os
f = open("out.txt", "r")
os.chdir("base location")
for line in file:
os.system("mkdir {}".format(line.strip().replace(" ", r"\ ")))
问题在于,mkdir
这个命令会把你输入的内容当作要创建的文件夹列表来处理,除非你对空格进行特殊处理。
这里其他的回答都是对的——问题出在Unix命令的使用上。如果你想用mkdir命令创建一个名字里有空格的文件夹,你必须要么在空格前加上反斜杠(\)来转义空格,要么把名字放在引号里,这样Unix环境才知道你只有一个参数,并且这个参数里有空格;否则,它会把每个参数/单词都当成一个独立的文件夹来创建。
我想补充两点:
每次你用
open()
打开一个文件时,都要确保最后用close()
把它关闭。最简单的方法是使用上下文管理器,比如with open(file) as f:
。os
模块其实有一个mkdir
函数,可以接受一个字符串作为参数。你可以直接把每一行传给os.mkdir
。
所以,你可以把你的代码改成这样:
import os
with open("out.txt", "r") as f:
os.chdir("base location")
for line in f:
os.mkdir(line.strip())
如果你在Linux系统中运行:
mkdir hello world
你会创建两个文件夹,一个叫“hello”,另一个叫“world”。
如果你想创建一个名字中有空格的文件夹,比如“hello world”,你需要运行:
mkdir "hello world"
没有示例输入很难确定,但看起来你需要在创建目录时加上引号。
for line in f:
os.system("mkdir '%s'" % line.strip())
在Windows系统上,单引号可能会导致一些不好的效果,所以使用双引号可能是必要的。
for line in f:
os.system('mkdir "%s"' % line.strip())
这不是一个Python的问题,而是操作系统的问题。我猜您是在使用Linux(您没有说明)。
运行这个:
mkdir Line with multiple words
...会创建四个文件夹,而不是一个。
更新: @bgporter也解释了这个问题。
更好的解决办法是不要使用os.system
(基本上,尽量不要用),而是使用os.mkdir
来创建文件夹:
import os
f = open("out.txt", "r")
os.chdir("base location")
for line in f:
s = line.strip()
if len(s)>0:
# ignore blank or whitespace-only lines
os.mkdir(s)