python 2.6.6“幽灵”空格

时间:2011-04-29 10:35:46

标签: python

基本上,我打开一些文件并删除该文件中每一行的所有空格。 代码段:

for filepath in filelist:
        if filepath.endswith(".shader"):
            shaderfile = open(filepath,"r").readlines()
            for line in shaderfile:
                line = Left(line, line.find("\n"))+"\n"
                line = line.replace(" ","")
                if line.find("common/")>-1:
                    print(line.replace("\n","\\n"))

根据要求,我删除了不那么重要的代码。

有两件奇怪的事情发生了:

1)有些行以“\ n \ n”结尾

2)我得到了这个输出:

textures/common/lightgrid\n
textures/common/mirror1
 \n
textures/common/mirror2
 \n
maptextures/common/invisible.tga
 \n
textures/common/watercaulk
 \n
textures/common/clipnokick
 \n
textures/common/invisible\n

3)当我在这里粘贴输出时,它看起来像:

textures/common/lightgrid\n
textures/common/mirror1\n
textures/common/mirror2\n
maptextures/common/invisible.tga\n
textures/common/watercaulk\n
textures/common/clipnokick\n
textures/common/invisible\n

我真的不知道发生了什么。这是print()的错误吗? 抱歉格式错误,但这不是我的错,它是stackoverflow的。

2 个答案:

答案 0 :(得分:1)

from StringIO import StringIO

a = StringIO("""textures/common/lightgrid
textures/common/mirror1

textures/common/mirror2

maptextures/common/invisible.tga

textures/common/watercaulk

textures/common/clipnokick

textures/common/invisible""")


def clean_lines(fileobj):
    for line in fileobj:
        if line:
            line = line.strip()
            if line:
                yield "%s\n" % line


print [line for line in clean_lines(a)]

我使用stringIO来模拟文件,只需用你的fileobj替换一个文件。

答案 1 :(得分:0)

您似乎想要输出

textures/common/lightgrid\ntextures/common/mirror1\n...

而你正在获得

textures/common/lightgrid\n
textures/common/mirror1\n
...

这是因为print 语句添加了隐式换行符。

您可以使用普通文件输出:

from sys import stdout
# ...
stdout.write("foo") # adds no implicit newline

您可以使用从Python 3移植的功能 print()

from __future__ import print_function
#
print("foo", end="") # use empty string instead of default newline

此外,如果您需要从字符串中的 中删除空格,则可以使其更简单,效率更高。

import re # regular expressions
whitespace_rx = re.compile(r"\s+") # matches any number of whitespace
# ...
splinters = whitespace_rx.split(raw_line) # "a b\nc" -> ['a','b','c']
compacted_line = "".join(splinters) # ['a','b','c'] -> 'abc'

当然,您只需将splinters替换为.split()