Python .csv在字典中,具有更改的标题名称和索引

Python .csv在字典中,具有更改的标题名称和索引,python,python-3.x,pandas,csv,Python,Python 3.x,Pandas,Csv,我试图将选项卡分隔文件的特定列放入字典中。我尝试了几件事,但没有一件能给我想要的结果 例如,我有以下文件: Name Start End Size del1 100 105 5 del2 150 160 10 del3 250 300 50 和这个文件,都是.csv Name Qual StartB EndB Size inv1 6 400 405 5 inv2 7 450

我试图将选项卡分隔文件的特定列放入字典中。我尝试了几件事,但没有一件能给我想要的结果

例如,我有以下文件:

Name   Start   End   Size
del1   100     105   5
del2   150     160   10
del3   250     300   50
和这个文件,都是.csv

Name   Qual   StartB  EndB  Size
inv1   6      400     405   5
inv2   7      450     460   10
inv3   20     450     400   50
我想要的是这样的东西,其中Name是键,其他的是值,另外我有更改标题和标题索引的问题,但它们的意思是一样的:

del_dict{del1: {Start: 100, End: 105, Size:5} del2: {etc}
根据其他堆栈溢出的答案,我尝试了几种方法读取该文件

for file in glob.glob(directoryname + "/*.csv"):
    dict = pd.read_csv(file, squeeze=False, sep="\t").to_dict()
        print(dict)

但这给了我数据帧,我似乎无法将其放入字典中

我也试过这段代码,我以前用过,但是它只有一个文件,没有改变标题,然后它会导致太多循环和硬编码,无法根据我打开的文件消化我需要的所有内容

for file in glob.glob(directoryname + "/*.csv"):
    with open(file, 'r') as csvfile:
        csv_list = []
        for line in csvfile:
            csv_list.append(line.strip("\t"))

我对python相当陌生,我知道必须有一个相对简单的答案,但我似乎找不到它。很抱歉,如果答案已经在堆栈溢出上,我花了几个小时试图找到一个类似的/可行的问题,这就是我真正遇到的问题。

我认为需要使用按列创建索引
名称
,然后使用参数调用
orient='index'

df = pd.read_csv(file,  sep="\t")

d = df.set_index('Name').to_dict(orient='index')
print (d)
{'del1': {'Start': 100, 'End': 105, 'Size': 5},
 'del2': {'Start': 150, 'End': 160, 'Size': 10},
 'del3': {'Start': 250, 'End': 300, 'Size': 50}}
编辑-您可以按字典重命名列名称,并按列表列选择要导出到dict的列:

d = {'StartB':'Start','EndB':'End'}
d = df.set_index('Name').rename(columns=d)[['Start','End','Size']].to_dict(orient='index')
print (d)
{'inv1': {'Start': 400, 'End': 405, 'Size': 5}, 
 'inv2': {'Start': 450, 'End': 460, 'Size': 10}, 
 'inv3': {'Start': 450, 'End': 400, 'Size': 50}}

基于@jezrael(标记为answer)的帮助和专业知识,我将我的最终代码放在这里,在这里我还以我需要的格式合并了字典,并找到了一个解决每个文件中不存在的列的方法

如果这不是堆栈溢出的方法,请让我知道

    csv_dict = {}
    for file in glob.glob(directoryname + "/*.csv"):
        df = pd.read_csv(file, sep="\t")
        d = {'StartB': 'Start', 'EndB': 'End'}
        if "Duplications" in df.keys():
            d = df.set_index('Name').rename(columns=d)[['Start', 'End', 'Size', 'Duplications']].to_dict(orient='index')
            csv_dict.update(d)
        else:
            d = df.set_index('Name').rename(columns=d)[['Start', 'End', 'Size']].to_dict(orient='index')
            csv_dict.update(d)
    print(csv_dict)
结果:

{'del1': {'Start': 969261, 'End': 969270, 'Size': 10}, 
'del2': {'Start': 641573, 'End': 641672, 'Size': 100}, 
'del3': {'Start': 998620, 'End': 999119, 'Size': 500}, 
'dup1': {'Start': 595662, 'End': 595671, 'Size': 10, 'Duplications': 3}, 
'dup2': {'Start': 321225, 'End': 321324, 'Size': 100, 'Duplications': 3}, 
'dup3': {'Start': 971634, 'End': 972133, 'Size': 500, 'Duplications': 10}, 
'inv1': {'Start': 818450, 'End': 818459, 'Size': 10}, 
'inv2': {'Start': 991098, 'End': 991197, 'Size': 100},
'inv3': {'Start': 219635, 'End': 220134, 'Size': 500}}

谢谢你的快速回复。这似乎行得通!。但是现在我在字典中有了整个文件(它比我上面给出的例子要大得多)。在上面的简单示例中,我不需要“Qual”列,“StartB”与“Start”相同(只有Start和End有这个问题)。您能帮我解决这个问题吗?@Fini-解决方案是使用字典进行重命名,检查编辑后的答案。此外,如果存在某种模式-例如,每个文件只有不同的最后一个字母,则应动态创建dict。让我知道如何解决问题。谢谢!我已经在尝试重命名字典,但是这个解决方案效果更好。这是目前所期望的结果,但当然我需要在实际文件中实现这一点,并从文件中获取更多列,但这应该没有问题。我现在遇到的唯一问题是,一个文件有一个额外的列,我需要名为“replications”,但添加该列当然会导致一个错误,即复制不在索引中(在某些文件中)。因为这不是问题的范围,我将把它标记为anwer。谢谢@菲尼-不客气!如果要删除不在每个数据帧中的某个列,请使用解决方案。实际上,情况正好相反。为了在这个例子中解决这个问题,我确实需要“Qual”列。但该列仅在文件2中,而不在文件1中,因此您会得到一个keyrerror。但我会努力在某个地方找到答案。我想我必须使用if语句,比如:if“Qual”不在df.keys()中:您的代码,否则:添加了“Qual”的代码
{'del1': {'Start': 969261, 'End': 969270, 'Size': 10}, 
'del2': {'Start': 641573, 'End': 641672, 'Size': 100}, 
'del3': {'Start': 998620, 'End': 999119, 'Size': 500}, 
'dup1': {'Start': 595662, 'End': 595671, 'Size': 10, 'Duplications': 3}, 
'dup2': {'Start': 321225, 'End': 321324, 'Size': 100, 'Duplications': 3}, 
'dup3': {'Start': 971634, 'End': 972133, 'Size': 500, 'Duplications': 10}, 
'inv1': {'Start': 818450, 'End': 818459, 'Size': 10}, 
'inv2': {'Start': 991098, 'End': 991197, 'Size': 100},
'inv3': {'Start': 219635, 'End': 220134, 'Size': 500}}