熊猫在固定时间内读取csv使用分隔符

时间:2018-11-09 15:23:23

标签: python pandas csv logging

假设我有一个日志文件,其结构如下:

$date $machine $task_name $loggedstuff

我希望用pd.read_csv('blah.log', sep=r'\s+')阅读全部内容。问题是,$loggedstuff中有空格,是否有任何方法可以将分隔符限制为恰好运行3次,以便loggedstuff中的所有内容都将在数据框中显示为单个列?

我已经尝试使用csv来将其解析为列表列表,然后将其输入到熊猫中,但这很慢,我想知道是否还有更直接的方法可以做到这一点。谢谢!

3 个答案:

答案 0 :(得分:1)

设置

tmp.txt

public static boolean imprimirDocto(String documentPath, String printerName) {
        File f = new File(documentPath);
        try {
            PDDocument doc = PDDocument.load(f);

            PrinterJob pj = PrinterJob.getPrinterJob();

            PrintService[] ps = PrintServiceLookup.lookupPrintServices(null, null);
            PrintService printService = null;
            if (ps.length > 0) {
                //This searchs for all the printers, and looks for the 'printerName'
                for (int i = 0; i < ps.length; i++) {
                    System.out.println("Printer name: " + ps[i]);
                    if (ps[i].getName().toLowerCase().contains(printerName.toLowerCase())
                            || ps[i].getName().contains(printerName)) {

                        printService = ps[i];

                        System.out.println("Setting the printer...");
                        pj.setPrintService(printService);
                        i = ps.length;
                    }
                }

                pj.setPageable(new PDFPageable(doc));
                pj.print();

                return true;

            } else {
                return false;
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
    }

代码

a b c d
1 2 3 test1 test2 test3
1 2 3 test1 test2 test3 test4

返回

df = pd.read_csv('tmp.txt', sep='\n', header=None)
cols = df.loc[0].str.split(' ')[0]
df = df.drop(0)

def splitter(s):
    vals = s.iloc[0].split(' ')
    d = dict(zip(cols[:-1], vals))
    d[cols[-1]] = ' '.join(vals[len(cols) - 1: ])
    return pd.Series(d)

df.apply(splitter, axis=1)

答案 1 :(得分:1)

我认为您可以将csv文件的每一行作为一个字符串读取,然后通过正则表达式将结果数据帧转换为3列。

df = pd.read_csv('./test.csv', sep='#', squeeze=True)
df = df.str.extract('([^\s]+)\s+([^\s]+)\s+(.+)')

,您可以在其中将分隔符更改为文档中未出现的任何内容。

答案 2 :(得分:1)

使用expand=True时,拆分元素将展开为单独的列。

参数n可用于限制输出中的拆分次数。

关于同一根手杖From pandas.Series.str.split的详细信息

使用方式

  

df.str.split(pat = None,n = -1,expand = False)   expand:bool,默认为False

     

将拆分后的字符串扩展到单独的列中。

     

如果为True,则返回DataFrame / MultiIndex扩展维。

     

如果为False,则返回包含字符串列表的Series / Index

df.str.split(' ', n=3, expand=True)