在 csv(excel 格式)文件中搜索特定文本
Searching for specific text in csv(excel format) file
CVS Sample
所以我有一个 csv 文件(上面 link 中的示例),第 7 行有变量名,第 8 行有值。变量后面都有单位,值就是这样的数字:
Velocity (ft/s) Volumetric (Mgal/d Mass Flow (klb/d) Sound Speed (ft/s)
.-0l.121 1.232 1.4533434 1.233423
还有很多变量,但基本上我需要一些方法来在 csv 文件中搜索特定的单位组,然后将与之关联的值附加到列表中。例如搜索文本“(ft/s)”,然后制作一个以 Velocity 和 Sound speed 为 Keys 及其关联值的字典。我无法执行此操作,因为 csv 的格式类似于 excel 电子表格,并且单元格包含整个变量名称及其单位
最后我将为每个单元组创建一个字典,我需要这样做,因为每个生成的 csv 文件,单元组都会发生变化(ft/s 变为 m/s)。我也不能使用 excel 读取,因为它在 IronPython 中不起作用。
我会帮助您完成我认为您卡住的部分,即尝试从类别中提取单位。鉴于您的数据,您最好的选择可能是使用正则表达式,以下应该有效:
import re
f = open('data.csv')
# I assume the first row has the header you listed in your question
header = f.readline().split(',') #since you said its a csv
for item in header:
print re.search(r'\(.+\)', item).group()
print re.sub(r'\(.+\)', '', item)
那应该为您打印以下内容:
(ft/s)
Velocity
(Mgal/d)
Volumetric
(klb/d)
Mass Flow
(ft/s)
Sound Speed
您可以修改上面的内容以将它们存储在列表中,然后遍历它们以查找重复项并将适当的字符串合并到字典或诸如此类的东西中。
您可以使用 csv 模块将适当的行读入 list
s。
defaultdict
是数据聚合的好选择,而变量
名称和单位可以通过拆分 '('
.
轻松分开
import csv
import collections
with open(csv_file_name) as fp:
reader = csv.feader(fp)
for k in range(6): # skip 6 lines
next(reader)
varnames = next(reader) # 7th line
values = next(reader) # 8th line
groups = collections.defaultdict(dict)
for i, (col, value) in enumerate(zip(varnames, values)):
if i < 2:
continue
name, units = map(str.strip, col.strip(')').split('(', 1))
groups[units][name] = float(value)
编辑: 添加了跳过前两列的代码
CVS Sample
所以我有一个 csv 文件(上面 link 中的示例),第 7 行有变量名,第 8 行有值。变量后面都有单位,值就是这样的数字:
Velocity (ft/s) Volumetric (Mgal/d Mass Flow (klb/d) Sound Speed (ft/s)
.-0l.121 1.232 1.4533434 1.233423
还有很多变量,但基本上我需要一些方法来在 csv 文件中搜索特定的单位组,然后将与之关联的值附加到列表中。例如搜索文本“(ft/s)”,然后制作一个以 Velocity 和 Sound speed 为 Keys 及其关联值的字典。我无法执行此操作,因为 csv 的格式类似于 excel 电子表格,并且单元格包含整个变量名称及其单位
最后我将为每个单元组创建一个字典,我需要这样做,因为每个生成的 csv 文件,单元组都会发生变化(ft/s 变为 m/s)。我也不能使用 excel 读取,因为它在 IronPython 中不起作用。
我会帮助您完成我认为您卡住的部分,即尝试从类别中提取单位。鉴于您的数据,您最好的选择可能是使用正则表达式,以下应该有效:
import re
f = open('data.csv')
# I assume the first row has the header you listed in your question
header = f.readline().split(',') #since you said its a csv
for item in header:
print re.search(r'\(.+\)', item).group()
print re.sub(r'\(.+\)', '', item)
那应该为您打印以下内容:
(ft/s)
Velocity
(Mgal/d)
Volumetric
(klb/d)
Mass Flow
(ft/s)
Sound Speed
您可以修改上面的内容以将它们存储在列表中,然后遍历它们以查找重复项并将适当的字符串合并到字典或诸如此类的东西中。
您可以使用 csv 模块将适当的行读入 list
s。
defaultdict
是数据聚合的好选择,而变量
名称和单位可以通过拆分 '('
.
import csv
import collections
with open(csv_file_name) as fp:
reader = csv.feader(fp)
for k in range(6): # skip 6 lines
next(reader)
varnames = next(reader) # 7th line
values = next(reader) # 8th line
groups = collections.defaultdict(dict)
for i, (col, value) in enumerate(zip(varnames, values)):
if i < 2:
continue
name, units = map(str.strip, col.strip(')').split('(', 1))
groups[units][name] = float(value)
编辑: 添加了跳过前两列的代码