python逐行读取txt文件 每行为一个list

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python逐行读取txt文件 每行为一个list相关的知识,希望对你有一定的参考价值。

文件tags.txt,里第一列是image id,后面是image的tags,我现在想逐行读取,每行除了第一列的image id的tags存为一个list,list名定义为image id。比如,第一行的数据是:17991735034 great art tram llandudno k5 sigma 1750我想存成{great art tram llandudno k5 sigma 1750} listName=17991735034或者除去第一列,给每一个list编号也可以list1={great art tram llandudno k5 sigma 1750} 以此存完每一行

#!/usr/bin/env Python
# coding=utf-8

import re
# 你的文件路径
path = "./tags.txt"
# 读取文件
file = open(path, encoding="utf-8")
# 定义一个用于切割字符串的正则
seq = re.compile("\\s+")

result = []
# 逐行读取
for line in file:
    lst = seq.split(line.strip())
    item = 
        "name": lst[0],
        "val": lst[1:]
    
    result.append(item)
# 关闭文件    
file.close()
print(result)

# 输出结果类似:
[
    
       "name":1,
       "val": ["v1","v2"]
    ,
    
       "name":2,
       "val": ["v1","v2"]
    
]

参考技术A import re
patt = re.compile(r"(?P<linename>\\d+)\\s+(?P<tags>.*)")
fmt = "%(tags)s"
with open("tags.txt", 'rt') as handle:
    for m in ifilter(None, imap(patt.match, handle)):
        print fmt % m.groupdict()

C++ 逐行读取文件,然后使用分隔符分割每一行

【中文标题】C++ 逐行读取文件,然后使用分隔符分割每一行【英文标题】:C++ Read file line by line then split each line using the delimiter 【发布时间】:2010-10-11 22:14:01 【问题描述】:

我想逐行读取一个txt文件,读取每一行后,我想根据选项卡“\t”分割该行并将每个部分添加到结构中的一个元素中。

我的结构是 1*char 和 2*int

struct myStruct

    char chr;
    int v1;
    int v2;

其中 chr 可以包含多个字符。

一行应该是这样的:

randomstring TAB number TAB number NL

【问题讨论】:

一个 char 不能包含多个字符,您可能是指 char* 也是 v1 和 2 的用途对我来说并不完全清楚。 @Mark 他可能正在忙着编辑…… 有什么代码可以给我们看吗?你能告诉我们v1v2 是什么吗?有限制吗? @sikas:好的,你已经把伪代码搞定了。那么是什么阻止您将其翻译成 C++ 呢? @sikas 那么现在是重新学习 C++ 的好时机。否则,您是否只是希望这里有人为您完成所有工作? 【参考方案1】:

尝试: 注意:如果 chr 可以包含超过 1 个字符,则使用字符串来表示。

std::ifstream file("plop");
std::string   line;

while(std::getline(file, line))

    std::stringstream   linestream(line);
    std::string         data;
    int                 val1;
    int                 val2;

    // If you have truly tab delimited data use getline() with third parameter.
    // If your data is just white space separated data
    // then the operator >> will do (it reads a space separated word into a string).
    std::getline(linestream, data, '\t');  // read up-to the first tab (discard tab).

    // Read the integers using the operator >>
    linestream >> val1 >> val2;

【讨论】:

【参考方案2】:

除非您也打算将此结构用于 C,否则我会将预期的 char* 替换为 std::string。

接下来,由于我打算能够从流中读取它,我将编写以下函数:

std::istream & operator>>( std::istream & is, myStruct & my )

    if( std::getline(is, my.str, '\t') )
       return is >> my.v1 >> my.v2;

以 str 作为 std::string 成员。这将写入您的结构,使用制表符作为第一个分隔符,然后任何空白分隔符都将在接下来的两个整数之前执行。 (你可以强制它使用标签)。

要逐行阅读,您可以继续阅读这些内容,或者先将行读入字符串,然后将字符串放入 istringstream 并调用上述内容。

您需要决定如何处理失败的读取。上述任何失败的读取都会使流处于失败状态。

【讨论】:

【参考方案3】:
std::ifstream in("fname");
while(in)
    std::string line;
    std::getline(in,line);
    size_t lasttab=line.find_last_of('\t');
    size_t firsttab=line.find_last_of('\t',lasttab-1);
    mystruct data;
    data.chr=line.substr(0,firsttab).c_str();
    data.v1=atoi(line.substr(firsttab,lasttab).c_str());
    data.v2=atoi(line.substr(lasttab).c_str());

【讨论】:

请查找为什么不使用 in 作为循环的条件。【参考方案4】:

我在遵循这里的一些建议时遇到了一些困难,因此我发布了一个完整的示例,该示例在制表符分隔的文件上重载结构的输入和输出运算符。作为奖励,它还从stdin 或通过命令参数提供的文件获取输入。

我相信这在遵守运算符语义的同时尽可能简单。


pairwise.h

#ifndef PAIRWISE_VALUE
#define PAIRWISE_VALUE

#include <string>
#include <iostream>

struct PairwiseValue

    std::string labelA;
    std::string labelB;
    float value;
;

std::ostream& operator<<(std::ostream& os, const PairwiseValue& p);

std::istream& operator>>(std::istream& is, PairwiseValue& p);

#endif

pairwise.cc

#include "pairwise.h"

std::ostream& operator<<(std::ostream& os, const PairwiseValue& p)

    os << p.labelA << '\t' << p.labelB << '\t' << p.value << std::endl;
    return os;


std::istream& operator>>(std::istream& is, PairwiseValue& p)

    PairwiseValue pv;

    if ((is >> pv.labelA >> pv.labelB >> pv.value))
    
        p = pv;
    

    return is;


test.cc

#include <fstream>
#include "pairwise.h"

int main(const int argc, const char* argv[])

    std::ios_base::sync_with_stdio(false); // disable synch with stdio (enables input buffering)

    std::string ifilename;
    if (argc == 2)
    
        ifilename = argv[1];
    

    const bool use_stdin = ifilename.empty();
    std::ifstream ifs;
    if (!use_stdin)
    
        ifs.open(ifilename);

        if (!ifs)
        
            std::cerr << "Error opening input file: " << ifilename << std::endl;
            return 1;
        
    

    std::istream& is = ifs.is_open() ? static_cast<std::istream&>(ifs) : std::cin;

    PairwiseValue pv;

    while (is >> pv)
    
        std::cout << pv;
    

    return 0;


编译

g++ -c pairwise.cc test.cc
g++ -o test pairwise.o test.o

用法

./test myvector.tsv
cat myvector.tsv | ./test

【讨论】:

以上是关于python逐行读取txt文件 每行为一个list的主要内容,如果未能解决你的问题,请参考以下文章

Python逐行读取txt文本,按符合分割词并逐行写入txt

如何用python读取txt内不规则数据,并保存?

逐行读取文件数据,分析每一行数据与目标字符串的相似度,Python

逐行读取TXT文件-Python [重复]

Python从txt文件中逐行读取数据

逐行读取txt文件,使用Linq与StreamReader的Readline方法