1

这是一个具体的问题,将帮助我完成即将发布的项目。这很简单,我对 Python 很陌生,我的背景主要是艺术。我喜欢它,但我也觉得它很有挑战性。

我有一个包含数字/名称列表的文本文件(Data.txt),如下所示(简短示例):

String 1
34.6
45.6
45.9
String 2
34.6
45.6
45.9  

这是一个混合列表。在每个 String....12 个数字之后,依此类推。请注意,数字是“浮动的”。

我设计了这个:

numberList = []
data = []
data = open("SalesData.txt").read().split()
for i in data:
        numberList.append(i)
print numberList

这将附加并打印外部 .txt 列表中的所有数据。如何在新列表(numberList)中获取所有数据,但不包括通过读取文件找到的所有“字符串”。这样,我可以只对数字进行总和 ---

4

6 回答 6

2

首先,你不应该.read().split()在你的文件上做 - 这将在任何空白处分割,而不仅仅是在换行符上。幸运的是,Python 可以直接遍历文件。

然后,您可以尝试将每一行转换为浮点数,并且仅在可行时将其附加到列表中(否则跳过它)。此外,您可以立即将其转换为浮点数 - 使其更容易总结。

number_list = []
with open("SalesData.txt") as myfile:
    for line in myfile:
        try:
            number_list.append(float(line))
        except ValueError:
            pass
print(sum(number_list))
于 2012-12-01T21:12:42.487 回答
1

如果您的数据是结构化的(似乎是这种情况),我会简单地使用一个计数器并删除 len 12 的每个序列的第一个元素。

这是一个例子:

numberList = []
data = []
counter = 0
with open("SalesData.txt") as myfile:
    for line in myfile:
        if counter > 0:
            number_list.append(float(line))
        counter = (counter + 1) % 12
print numberList
于 2012-12-01T21:15:27.320 回答
1

只需遍历行并仅将数字添加到列表中...

with open("somefile.txt") as f:
     my_list = []
     for line in f:
         try:
            my_list.append(float(line))
         except ValueError:
             pass

print sum(my_list)
于 2012-12-01T21:11:24.467 回答
0
import re

ss =  '''String 1 
34.6 
45.6 
45.9 
String 2 
34.6 
45.6 
45.9 

'''

print re.findall('^(?!.*?[a-zA-Z])[0-9.+-]+',ss,re.MULTILINE)

但是如果可以有没有 ASCII 的字母,它就行不通了

于 2012-12-01T21:22:37.527 回答
0

尝试这个:

tsum = []
for j in numberList:
    try: tsum.append(float(j))
    except: pass
sum = sum(tsum)
于 2012-12-01T21:10:29.947 回答
0

你可以做类型检查,或者如果数字实际上是字符串中的数字,你可以做一些类似"13".isdigit()检查的事情,但我可能想做一些更聪明的事情:

numberList = []

for i in range(0, len(data)/13):
    numberList.append(data[1*(i+1):13*(i+1)])

那个(或类似的东西)应该针对字符串后面的数字组。这确实取决于您的输入数据不是垃圾,但它在大型数据集上的工作速度应该比做.isdigit()或其他类型检查更快。

于 2012-12-01T21:11:53.380 回答