我正在尝试从文本文件中读取第一列和第三列,并将它们添加在一起。
下面的代码可以完美地工作,并为我提供所需的结果,但是尝试找出是否有更好的pythonic方式编写此代码?
with open('random.txt', 'r') as fn:
next(fn)
numbers = fn.readlines()
first_col = [int(x.split(',')[0]) for x in numbers]
third_col = [int(y.split(',')[2]) for y in numbers]
result = [v + z for v, z in zip(first_col, third_col)]
print(result)
随机文件实际上是随机文件。
col1,col2,col3
44,65,78
55,87,98
12,32,62
结果:
[122, 153, 74]
答案 0 :(得分:5)
如果可以使用numpy
,那么我的建议是使用loadtxt
函数:
import numpy as np
np.loadtxt('random.txt', dtype=int, skiprows=1, delimiter=',', usecols=(0, 2)).sum(axis=1).tolist()
答案 1 :(得分:3)
您可以使用linebreaks<br/>waw
:
zip
或者如果您不需要按住cols:
with open('random.txt', 'r') as fn:
next(fn)
first_col, _, third_col = [
*zip(*(int(x) for x in map(lambda x: x.split(','), fn))
]
...
results = [x+y for x, y in zip(first_col, second_col)]
答案 2 :(得分:2)
除了此处提供的答案之外,您还可以使用csv
包来处理文件。
import csv
with open('random.txt', 'r') as fn:
csv_reader = csv.reader(fn)
next(csv_reader, None) # skip the headers
result = [int(f)+int(t) for f,_, t in csv_reader]
print result
最简单的解决方案是,如果您愿意使用pandas
。
import pandas as pd
df = pd.read_csv('random.txt')
print df.col1 + df.col2
如果您希望结果为list
,
import pandas as pd
df = pd.read_csv('random.txt')
res = df.col1 + df.col2
print res.tolist()
答案 3 :(得分:2)
您的代码足够“ pythonic”,但是您需要做的工作和占用的空间都比您需要的多。
with open('random.txt', 'r') as fn:
next(fn) # skip the first row
total = 0
for row in fn:
first_col, _, third_col = row.split(',')
total += int(first_col) + int(third_col)
print(result)
也许可以用一个函数来整理一下
def sum_row(row):
first_col, _, third_col = row.split(',')
return int(first_col) + int(third_col)
with open('random.txt', 'r') as fn:
next(fn) # skip the first row
result = sum(sum_row(row) for row in fn)
print result
如果您需要工业强度解决方案,即其他人也正在使用此解决方案,并且将来可能需要对其进行维护,请使用csv。
import csv
def sum_row(row):
return int(row[0]) + int(row[2])
with open('random.txt', 'r') as fn:
reader = csv.reader(fn)
result = sum(sum_row(row) for row in fn)
答案 4 :(得分:2)
我想说,最简单的方法就是坚持基础知识,没有正确的pythonic
方法!您可以使代码变得既简单又复杂。
import csv
res = []
with open('file.txt', 'r') as fp:
#Open csv file
reader = csv.reader(fp)
next(reader)
#Iterate through rows and append the sum of first and third rows to a list
for row in reader:
res.append(int(row[0]) + int(row[2]))
print(res)
#[122, 153, 74]
答案 5 :(得分:1)
import sys
import csv
with open(sys.argv[1]) as fh:
reader = csv.reader(fh)
rows = [list(map(int, row)) for row in reader]
sums = [v + z for v, _, z in rows]
print(sums) # [122, 153, 74]
答案 6 :(得分:1)
还有一种具有单行列表理解的选项,但是我们必须使用methodcaller
高阶函数来从文件中拆分每一行。
列表理解从文件中获取行,然后map
函数对每个文件执行一个split(",")
方法,将其转换为列列表。
from operator import methodcaller
with open('random.txt','r') as f:
next(f)
sum = [ int(c1)+int(c3) for c1,_,c3 in map(methodcaller("split", ","),f)]
sum
另一个优点是我们可以将其转换为生成器而不会浪费任何内存。
from operator import methodcaller
with open('data','r') as f:
next(f)
v = ( int(c1)+int(c3) for c1,_,c3 in map(methodcaller("split", ","),f))
print(list(v)) # just to print the result