python-3.x - 仅从具有 Python 中某些关键字的 txt 文件中的特定行中提取数字
问题描述
我只想从 txt 文件中具有特定关键字的行中提取数字并将它们相加然后比较它们,然后打印最高总数和最低总数。我该怎么办?
我想打印最高和最低的有效总数
我设法提取了其中包含“有效”关键字的行,但现在我想从这些行中获取数字,然后将每行的数字相加,然后将这些数字与具有相同关键字的其他行进行比较并打印最高和最低的有效数字。
到目前为止我的代码
#get file object reference to the file
file = open("shelfs.txt", "r")
#read content of file to string
data = file.read()
#close file<br>
closefile = file.close()
#get number of occurrences of the substring in the string
totalshelfs = data.count("SHELF")
totalvalid = data.count("VALID")
totalinvalid = data.count("INVALID")
print('Number of total shelfs :', totalshelfs)
print('Number of valid valid books :', totalvalid)
print('Number of invalid books :', totalinvalid)
txt 文件
HEADER|<br>
SHELF|2200019605568|<br>
BOOK|20200120000000|4810.1|20210402|VALID|<br>
SHELF|1591024987400|<br>
BOOK|20200215000000|29310.0|20210401|VALID|<br>
SHELF|1300001188124|<br>
BOOK|20200229000000|11519.0|20210401|VALID|<br>
SHELF|1300001188124|<br>
BOOK|20200329001234|115.0|20210331|INVALID|<br>
SHELF|1300001188124|<br>
BOOK|2020032904567|1144.0|20210401|INVALID|<br>
FOOTER|
解决方案
您需要的是使用 pandas 库。
您可以像这样读取 csv 文件:
data = pd.read_csv('shelfs.txt', sep='|')
它返回一个可以轻松选择或排序数据的 DataFrame 对象。它将使用第一行作为标题,然后您可以选择特定的列,如字典:
header = data['HEADER']
header 是一个 Series 对象。
要选择列,您可以执行以下操作:
shelfs = data.loc[:,data['HEADER']=='SHELF']
仅选择标题为“SHELF”的行。
我只是不确定 pandas 将如何处理您只有 1 个标题但有 2 或 5 列的事实。
也许您应该尝试在 csv 中为每个 colmun 创建一个标题,然后添加分隔符以使每一行首先具有相同的大小。
编辑(没有外部库或 txt 文件中的更改):
# Split by row
data = data.split('<br>\n')
# Split by col
data = [d.split('|') for d in data]
# Fill empty cells
n_cols = max([len(d) for d in data])
for i in range(len(data)):
while len(data[i])<n_cols:
data[i].append('')
# List VALID rows
valid_rows = [d for d in data if d[4]=='VALID']
# Get sum min and max
valid_sum = [d[1]+d[2]+d[3] for d in valid_rows]
valid_minimum = min(valid_sum)
valid_maximum = max(valid_sum)
这可能不是您想要做的,但它解决了您的部分问题。我没有测试代码。
推荐阅读
- python - 跟踪计算哪个子集以避免混合结果
- stripe-payments - 如何使用条带添加资金不足的支付来源?
- r - 用 R Markdown 编织的 ggplot barplot
- mediawiki - 相同的页面名称。命名空间?别名?等级制度?
- java - 从 JSONArray (Java) 中删除可重复的值
- linux - 交叉编译 ARM 的 arp-scan
- angular - nativescript-ui-listview 抛出 ERROR TypeError: undefined is not an object (evalating 'navBar.tintColor = color.ios')
- android - onConfigurationsChanged 解锁设备时第一次没有调用
- react-native - 可能的未处理承诺拒绝(id:0):ReferenceError:未定义用户ReferenceError:未定义用户
- wpf - 子项目控件不显示图片