如何从列表元素中删除\ n?

时间:2010-10-03 11:12:25

标签: python list newline

我正在尝试将Python从.txt文件中读取到读取行,并将第一行的元素写入列表。文件中的元素是以制表符分隔的,因此我使用split("\t")来分隔元素。因为.txt文件有很多元素,所以我将每行中找到的数据保存到一个单独的列表中。

我目前遇到的问题是它显示的每个列表都是这样的:

['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']

如何从列表的最后一个元素中删除\n并将其设为'7.3'

15 个答案:

答案 0 :(得分:121)

如果您只想从最后一个元素中删除\n,请使用:

t[-1] = t[-1].strip()

如果要从所有元素中删除\n,请使用以下命令:

t = map(lambda s: s.strip(), t)

您可能还会考虑在分割行之前删除\n

line = line.strip()
# split line...

答案 1 :(得分:34)

从Python3开始

map不再返回list而是mapObject,因此答案看起来像

>>> map(lambda x:x.strip(),l)
<map object at 0x7f00b1839fd0>

您可以在What’s New In Python 3.0上了解更多相关信息。

  

map()filter()返回迭代器。如果您确实需要list,则可以快速修复list(map(...))

现在有什么方法可以解决这个问题?

案例1 - 使用list

map lambda来电map

list返回迭代器list是一个可以将迭代器转换为列表的函数。因此,您需要围绕map打包>>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'] >>> list(map(lambda x:x.strip(),l)) ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3'] 。所以答案现在变成了,

$ python3 -m timeit "l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'];list(map(lambda x:x.strip(),l))"
100000 loops, best of 3: 2.22 usec per loop

很好,我们得到了输出。现在我们检查这段代码执行所需的时间。

list

2.22微秒。那不是那么糟糕。但是有更有效的方法吗?

案例2 - map调用lambda而不是lambda

map在Python社区中被许多人所厌恶(包括Guido)。除此之外,它将大大降低程序的速度。因此,我们需要尽可能避免这种情况。顶级函数str.strip。来帮助我们。

lambda可以使用str.strip作为

重新编写而不使用>>> list(map(str.strip,l)) ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']
$ python3 -m timeit "l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'];list(map(str.strip,l))"
1000000 loops, best of 3: 1.38 usec per loop

现在是时候了。

lambda

优秀。您可以看到两种方式之间的效率差异。它快了近60%。因此,不使用map的方法在这里是更好的选择。

案例3 - 遵循指南,常规方式

What’s New In Python 3.0的另一个重点是它建议我们尽可能避免使用map()

  

特别棘手的是for被调用的副作用   功能;正确的转换是使用常规map循环   (因为创建列表只会浪费)。

因此,我们可以使用常规for循环在没有>>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'] >>> final_list = [] >>> for i in l: ... final_list.append(i.strip()) ... >>> final_list ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3'] 的情况下解决此问题。

解决蛮力的琐碎方法是: -

def f():
    l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']
    final_list = []
    for i in l:
         final_list.append(i.strip())
import timeit
print(min(timeit.repeat("f()","from __main__ import f")))

时间设置

1.5322505849981098

结果。

map

正如你所看到的那样,蛮力有点慢。但它对于普通程序员而言比>>> [i.strip() for i in l] ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3'] 子句更具可读性。

案例4 - 列表理解

此处list comprehension也是可能的,与Python2中的相同。

$ python3 -m timeit "l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'];[i.strip() for i in l]"
1000000 loops, best of 3: 1.28 usec per loop

现在为时间安排:

map

正如您所看到的,列表理解比lambda更有效(即使没有map)。 因此,Python3中的拇指规则是使用列表推导而不是>>> l = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n'] >>> for i,s in enumerate(l): ... l[i] = s.strip() ... >>> l ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']

案例5 - 就地机制和空间效率(T-M-T

最后一种方法是在列表本身内进行更改。这样可以节省大量的内存空间。这可以使用enumerate完成。

1.4806894720022683

时间结果为---------------------------------------------------- |Case| method | Py3.4 |Place| Py3.5 |Place| |----|-----------------|-------|-----|-------|-----| | 1 | map with lambda | 2.22u | 5 | 2.85u | 5 | | 2 | map w/o lambda | 1.38u | 2 | 2.00u | 2 | | 3 | brute-force | 1.53u | 4 | 2.22u | 4 | | 4 | list comp | 1.28u | 1 | 1.25u | 1 | | 5 | in-place | 1.48u | 3 | 2.14u | 3 | ---------------------------------------------------- 。但是这种方式对空间有效。

<强> 结论

比较的时间列表(Python 3.4.3和Python 3.5.0)

map

最后请注意,列表理解是最好的方式,使用lambda的{​​{1}}是最差的。但是再次--- 仅限于PYTHON3

答案 2 :(得分:10)

听起来你想要像Perl chomp()这样的功能。

在Python中这很简单:

def chomp(s):
    return s[:-1] if s.endswith('\n') else s

...假设您使用的是Python 2.6或更高版本。否则只需稍微使用 更详细:

def chomp(s):
    if s.endwith('\n'):
        return s[:-1]
    else:
        return s

如果要从字符串末尾删除所有新行(在奇怪的情况下,由于某种原因可能有多个尾随换行符):

def chomps(s):
    return s.rstrip('\n')

显然,您永远不应该看到任何普通Python文件对象的readline()readlines()方法返回的字符串。

我看到人们从文件s[:-1]和类似函数的结果中盲目地删除最后一个字符(使用readline()切片)。这是一个坏主意,因为它可能导致文件的最后一行出错(在文件以换行符以外的任何内容结束的情况下)。

首先,当你盲目地从你读过的行中剥离最终字符时,你可能会陷入虚假的安全感。如果您使用普通的文本编辑器来创建测试套件文件,那么大多数人都会在最后一行的末尾静默添加换行符。要创建有效的测试文件,请使用以下代码:

f = open('sometest.txt', 'w')
f.write('some text')
f.close()

...然后如果你重新打开该文件并在其上使用readline()readlines()文件方法,你会发现文本是在没有尾随换行符的情况下读取的。

这种以非换行符结尾的文本文件的失败多年来一直困扰着许多UNIX实用程序和脚本语言。这是一个愚蠢的角落基础错误,它常常会成为一种害虫,但通常不足以让人们从中学习。我们可以争辩说,没有最终换行符的“文本”文件是“腐败的”或非标准的;这可能对某些编程规范有效。

然而,在我们的编码中忽略极端情况并且忽略了那些依赖于您的代码的人会非常容易。正如我的妻子所说:在编程方面......练习安全的十六进制!

答案 3 :(得分:5)

使用列表理解:

myList = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']

[(el.strip()) for el in myList]

答案 4 :(得分:3)

来自link

你可以使用rstrip()方法。实施例

mystring = "hello\n"    
print(mystring.rstrip('\n'))

答案 5 :(得分:2)

作为替代方法,如果您知道数据中没有空格(看起来就是这种情况),则可以使用split()(不带参数)。这在白色空间上分裂,并且使用比其他版本的分割更有效的算法。它还从两端剥去空白。

line = line.split()

就是这样。

答案 6 :(得分:2)

你可以做 -

DELIMITER = '\t'
lines = list()
for line in open('file.txt'):
    lines.append(line.strip().split(DELIMITER))

lines已获取您文件的所有内容。

还可以使用列表推导来使其更紧凑。

lines = [ line.strip().split(DELIMITER) for line in open('file.txt')]

答案 7 :(得分:2)

str.strip()删除空格字符。您还可以将自定义字符作为参数传递给strip。 strip 函数删除字符串两端的空白/自定义字符。 lstrip()和rstrip()分别为条带和右条带函数。

例如:

test_str = "Vishaka\n" 
test_str = test_str.strip()

test_str现在是Vishaka

答案 8 :(得分:2)

这也可以,

f=open('in.txt','r')

    for line in f:
            parline = line[:-1].split(',')

答案 9 :(得分:1)

您可以访问集合的最后一个元素,然后将值存储在变量中。

所以你有:

fileName = '7.3\n'

然后就这样做:

fileName.strip()

将为您留下7.3。然后将该值存储回集合的最后一个元素中。

您可以使用lstrip()rstrip()删除左侧或右侧。

答案 10 :(得分:0)

这可以从列表中的项目中取出\n(新行) 它只需要关闭字符串中的第一项

def remove_end(s):
    templist=[]
    for i in s:
        templist.append(i)
    return(templist[0])

答案 11 :(得分:0)

我遇到了这个问题,并使用上述的chomp函数解决了这个问题:

def chomp(s):
    return s[:-1] if s.endswith('\n') else s

def trim_newlines(slist):
    for i in range(len(slist)):
        slist[i] = chomp(slist[i])
    return slist
.....
names = theFile.readlines()
names = trim_newlines(names)
....

答案 12 :(得分:0)

要处理许多换行符分隔符,包括\r\n等字符组合,请使用splitlines。 合并joinsplitlines以从字符串s中删除/替换所有换行符:

''.join(s.splitlines())

要删除一个尾随 换行符,请将True作为keepends参数传递以保留分隔符,仅删除最后一个分隔符line:

def chomp(s):
    if len(s):
        lines = s.splitlines(True)
        last = lines.pop()
        return ''.join(lines + last.splitlines())
    else:
        return ''

答案 13 :(得分:0)

由于OP的问题是从最后一个元素中剥离换行符,我会用the_list[-1].rstrip()重置它:

>>> the_list = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']
>>> the_list[-1] = ls[-1].rstrip()
>>> the_list
['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']

是O(1)。

答案 14 :(得分:0)

new_list = ['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3\n']
for i in range(len(new_list)):
    new_list[i]=new_list[i].replace('\n','')
print(new_list)

输出将是这样

['Name1', '7.3', '6.9', '6.6', '6.6', '6.1', '6.4', '7.3']