0

我正在尝试读取文件的所有行,这些行要么全部大写,要么全部小写。

如果file.txt包含:

Rememberr 8? when you
. Tellingmee THAT one
didntrememberthat
onethingtoday

我希望它阅读:

didntrememberthat
ONETHINGTODAY

到目前为止,我有:

def function(file_name):
    data=[]
    f=open(file_name,'r')
    lines=f.readlines()
    for k in lines:
        single=tuple(k)
        for j in single:
            j=str(j)
            if j.isupper() or j.islower() == False:
            lines=f.readlines()[j:]

然后我得到这个:

lines=f.readlines()[j:]
TypeError: slice indices must be integers or None or have an __index__ method

这是有道理的,因为j它不是整数。但是我如何找到j它遇到if-statement时的位置?

如果有更简单的方法来做到这一点,那就太棒了

4

6 回答 6

5

您收到错误是因为 j 是一个字符串,而不是一个整数(顺便说一下,您不必调用str(j);它已经是一个字符串)。

您可以删除混合使用大写和小写的行,如下所示:

all_one_case = [ line
                 for line in f.readlines()
                 if line.isupper() or line.islower() ]

注意:感谢使用isupper()and islower()(原来使用的re.) 去这个问题的一些其他答案。

这也将包括,例如,10 green bottles因为它只包含小写字母,即使它也包含数字和空格。从这个问题来看,我无法判断这是否是意图。如果你只想要字母,你可以使用这个测试来代替:

               … if re.match('[A-Z]*$|[a-z]*$', line) ]

如果你想用这些行替换文件,你可以重新打开它来写:

with open(file_name, 'r') as f:
    for line in all_one_case:
        f.write(line)
于 2011-12-09T08:48:54.677 回答
2
def homogeneous_lines (file_name):
    with open(file_name) as fd:
        for line in fd:
            if line.islower() or line.isupper():
                yield line

此函数读取文件中的每一行。然后为每一行检查该行是全部大写还是小写。

最后我们让行。

编辑 - 更改为合并 using with 语句,使用内置 islower() 和 isupper() 字符串,并制成生成器。

于 2011-12-09T08:45:44.663 回答
1

如果在一行中只能有一个符号,那么我不知道为什么要将 line ( k) 转换为元组,而第二次调用f.readlines()可能是错误。在第一次调用后,f.readlines()所有行都在lines变量中,并且在循环中,您可以逐行检查它。

如果要检查整个字符串是小写还是大写,请使用以下代码:

if line.islower() or line.isupper():
    print(line)
于 2011-12-09T08:51:43.587 回答
1

我会使用列表推导:

f=open(file_name,'r')

lines = f.readlines()

ul_lines = [line.rstrip('\n') for line in lines if line.islower() or line.isupper()] 

如果你的文件是 unicode,你应该调整它,但这是一般的想法。

rstrip 部分是在最后去掉 '\n' 。

此外,内存效率更高的版本

f=open(file_name,'r')

ul_lines = [line.rstrip('\n') for line in f if line.islower() or line.isupper()] 

您必须重新打开文件才能重复它。

如果您的内存非常有限,您应该使用生成器表达式:

f=open(file_name,'r')

ul_lines_gen = (line.rstrip('\n') for line in f if line.islower() or line.isupper())

如果您只想在字符串中添加字母而没有数字,请添加 line.rstrip('\n').isalpha() 条件。

于 2011-12-09T08:55:53.253 回答
1
f=open(file_name,'r')
print [l for l in f.readlines() if l.islower() or l.isupper()]
于 2011-12-09T08:57:59.333 回答
1

使用文件的with语句open。这样,close即使在出现异常的情况下,文件也会得到 d 是安全的。使用字符串方法islowerisupper检查字符串是全部大写还是小写。例如像这样:

with open(filename) as f:
  output = [line for line in f if line.isupper() or line.islower()]
于 2011-12-09T08:58:03.390 回答