2013-02-05 56 views
-1
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在每行的末尾。我怎样才能删除它。我删除它后,我怎么把它变成一个整数列表? 我试着做一些像Python从列表中删除“ n”和再转换字符串列表为整数

list(map(int, my_list)) 

,但我得到,因为新线的错误。

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

会像'str.rstrip' \'str.strip'工作吗? –

+3

看起来非常像您正在尝试手动编写CSV文件解析器。不要那样做;只需使用标准['csv'](http://docs.python.org/3/library/csv.html)模块。 – abarnert

+1

不要只说“我得到一个错误”,请告诉我们错误(带回溯)。并确保您发布的代码实际上会产生该错误。并给我们一些(短)样本输入,证明错误。 – abarnert

回答

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 

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

+0

我收到'list'对象没有属性'split'错误。 – aldx1

+1

@ user2018488 - 我觉得很难相信。在上面的代码中,我看不到任何'line'应该是'list'类型的列表... – mgilson

+0

@mgilson:事实上,我看不到他的_original_代码如何以他描述的方式失败, 。我怀疑他的意见现在应该是什么,他的错误实际上与换行符无关。 – abarnert

0

如果你想解析CSV文件,你不想处理所有的错误情况,如最后一列中的换行符,逗号周围的空格等。使用Python自带的csv模块:

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))))) 
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脚本。根据你告诉我们的情况,任何事情都可能发生。

+0

我最好的猜测是该文件有一个空行在最后,我们没有看到的错误消息是'ValueError:无效的文字为int()与基地10:'\ n'',但谁可以说?也可以在行尾添加一个额外的''',但猜测可能不是很有效率。 – DSM

相关问题