Python从列表中删除'\ n',然后将列表中的字符串转换为整数

时间:2013-02-05 02:22:43

标签: python arrays list python-3.x integer

my_list = []
with open(home + "/Documents/stocks/" + filePath , newline='') as f:
    array1 = (line.split(',') for line in f.readlines())
    last_col = [line.split(',')[-1] for line in f]
    for line in array1:          
        my_list.append(line[-1])

这样可行,但my_list在每行末尾都有\n。我该如何删除它。删除后,如何将其转换为整数列表? 我尝试过像

这样的事情
list(map(int, my_list))

但由于换行,我收到错误。

ValueError: invalid literal for int() with base 10: 'Adj Close\n'

3 个答案:

答案 0 :(得分:0)

看起来您只想将最后一列作为整数列表。那是对的吗?如果是这样的话:

with open(datafile) as fin:
    last_column = [ int(line.split(',')[-1]) for line in fin ]

应该做的伎俩...

如果您希望每一行都是整数列表:

with open(datafile) as fin:
    rows = [ [int(x) for x in line.split(',')] for line in fin ]
    #same as
    #rows = [ list(map(int,line.split(','))) for line in fin ] #if you prefer ...

请注意,在python中,int将很乐意转换任何空格的字符串:

>>> print(int('\t\n300\n'))
300

所以新行不是问题...(使用python3.2和python2.7测试)

答案 1 :(得分:0)

如果你想解析CSV文件,你不希望必须处理所有繁琐的情况,例如最后一列中的换行符,逗号周围的空格等。只需使用后来的csv模块用Python:

my_list = []
with open(home + "/Documents/stocks/" + filePath) as f:
    for row in csv.reader(f):
        numbers = list(map(int, row))
        my_list.append(line[-1])

或者,可能更简单:

with open(home + "/Documents/stocks/" + filePath) as f:
    my_list = [list(map(int, row)) for row in csv.reader(f)]

将列表理解和map混合到一行看起来有点让我感到惊讶,但在这种情况下,我认为它看起来比纯粹的理解替代方案好一点:

with open(home + "/Documents/stocks/" + filePath) as f:
    my_list = [[int(col) for col in row] for row in csv.reader(f)]

比纯功能替代方案好很多:

my_list = list(map(compose(list, partial(map, int)), 
                   csv.reader(iterwith(open(home + "/Documents/stocks/" + filePath)))))

答案 2 :(得分:0)

您现有的代码适用于您正在尝试的内容。

为了使其自包含,我将文件作为StringIO移动到程序中,否则,这是您的代码,逐字逐句:

import io

f = io.StringIO('''1, 2, 3
4, 5, 6
''')

my_list = []
array1 = (line.split(',') for line in f.readlines())
last_col = [line.split(',')[-1] for line in f]
for line in array1:          
    my_list.append(line[-1])

print(list(map(int, my_list)))

这就是它的作用:

[3, 6]

这正是你想要的,对吗?

所以,如果它不起作用,那不是因为新行;这是因为别的东西。而且,既然你从来没有告诉我们错误是什么,或者除了“由于新线条而导致错误”以外的任何事情,没有人能猜出其他可能是什么。也许你在那里有一个3.6,而你正在获得ValueError: invalid literal for int() with base 10: '3.6'。也许您在指定的路径上没有文件,并且您收到FileNotFoundError错误。也许你忘记了一个shebang,你正在使用Python 2解释器或bash运行Python 3.x脚本。根据你告诉我们的内容,一切皆有可能。

相关问题