【问题标题】:How to create a list of tuples from two specific columns of a csv file?如何从 csv 文件的两个特定列创建元组列表?
【发布时间】:2023-03-14 13:17:02
【问题描述】:

我的 csv 文件如下所示:

{http://www.omg.org/XMI}id,begin,end,Character
18074,15,19,Tony
18120,39,46,Tony
18172,129,134,Clint
18217,175,180,Bucky
18202,245,249,Tony
18307,352,357,Bucky
18376,1297,1302,Steve
18421,1499,1504,Bruce
18489,1546,1553,Natasha
18527,1709,1712,Bucky

我希望能够从列beginend 创建一个元组列表,从第二行开始,当然忽略标题行。

到目前为止,我可以创建一个元组列表,但对于 所有 行和列:

import csv
import tkinter
from tkinter import filedialog
root_tk = tkinter.Tk()
root_tk.wm_withdraw()

filename = filedialog.askopenfilename()

with open(filename, 'r') as f:
    data=[tuple(line) for line in csv.reader(f)]

print(data)



root_tk.destroy()
root_tk.mainloop()

当前输出:

[('{http://www.omg.org/XMI}id', 'begin', 'end', 'Character'), ('18646', '518', '520', 'Anakin'), ('18699', '982', '985', 'Jedi'), ('18714', '1018', '1020', 'Anakin'), ('18766', '1057', '1059', 'Anakin'),...

期望的输出:

[(15, 19), (39,46), (129, 134), (175, 180)...]

如何将输出限制为这两列,同时忽略第一行并从中创建元组列表?

提前致谢!

编辑

我现在可以打印我想要的元组,但我仍然无法从输出中删除第一行。

另外,如何将字符串元组的输出转换为整数?

【问题讨论】:

  • tuple(line)[1:3] ?
  • @krishna 是的,我试过了。它有点工作,但它仍然给了我第一行(标题行),并将数字打印为带括号的字符串。我编辑了我的问题。

标签: python list csv tuples multiple-columns


【解决方案1】:

你可以使用pandas

In [615]: df = pd.read_csv('eg.csv')

In [616]: [(begin, end) for _, begin, end, _ in df.values.tolist()]
Out[616]:
[(15, 19),
 (39, 46),
 (129, 134),
 (175, 180),
 (245, 249),
 (352, 357),
 (1297, 1302),
 (1499, 1504),
 (1546, 1553),
 (1709, 1712)]

如果你想使用csv模块你可以试试

In [627]: with open('eg.csv', 'r') as f:
     ...:     csv_data = next(csv.reader(f), None)          # Skip first row
     ...:     data=[(int(line[1]), int(line[2])) for line in csv.reader(f) if line]
     ...:

或者根本没有任何导入的模块

In [639]: with open('eg.csv', 'r') as f:
     ...:     f.readline()               # Skip first row
     ...:     data=[tuple(map(int, line.split(',')[1:3])) for line in f.readlines() if line.strip()]
     ...:

【讨论】:

  • 对于这样一个简单的任务,pandas 是相当的大材小用。另外,看起来 OP 只使用标准库工具。
  • 只是另一种方法
【解决方案2】:

您可以使用DictReader 并根据您需要的列创建元组

import csv

filename = filedialog.askopenfilename()
with open(filename, 'r') as f:
    data=[(int(line['begin']),int(line['end'])) for line in  csv.DictReader(f)]
    print data

输出:

[(15, 19), (39, 46), (129, 134), (175, 180), (245, 249), (352, 357), (1297, 1302), (1499, 1504), (1546, 1553), (1709, 1712)]

希望这有帮助:)

【讨论】:

  • 这看起来不错!但正如我在上面的编辑中提到的,我也希望元组是数字,而不是括号下的字符串。它在你的代码中可行吗?
  • @Waldkamel 已修改。这有帮助吗?
  • 啊,太棒了!谢谢! :) - 如果我不烦人:是否可以只打印出唯一的元组?他们中的一些人在文件中出现了两次......如果太多了,没有压力! :)
  • 不用担心。 set 就是你要找的东西。 data = list(set(data)) 返回具有唯一元组的列表
  • 完美!再次感谢!
猜你喜欢
  • 2023-03-22
  • 2022-12-08
  • 2016-08-19
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 2020-02-16
  • 2020-02-27
  • 2019-03-26
相关资源
最近更新 更多