假设我有一个日志文件,其结构如下:
$date $machine $task_name $loggedstuff
我希望用pd.read_csv('blah.log', sep=r'\s+')
阅读全部内容。问题是,$loggedstuff
中有空格,是否有任何方法可以将分隔符限制为恰好运行3次,以便loggedstuff
中的所有内容都将在数据框中显示为单个列?
我已经尝试使用csv
来将其解析为列表列表,然后将其输入到熊猫中,但这很慢,我想知道是否还有更直接的方法可以做到这一点。谢谢!
答案 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)