2017-03-01 50 views
2

我有一个输入字符串,其分隔符为$$$Field$$$。该字符串有一些行。我需要返回字符串中所有项目的列表,仅由$$$Field$$$分隔。熊猫:在read_csv中忽略新行作为分隔符

在下面的例子中,我应该收到输出['Food', 'Fried\nChicken', 'Banana']。然而,似乎它也将新行解释为分隔符,所以不是列表,而是获取表格。我怎么能忽略这些新的线,以便我回来一个列表?

import pandas as pd 
from pandas.compat import StringIO 

temp=u"""Food$$$Field$$$Fried 
Chicken$$$Field$$$Banana""" 
df = pd.read_csv(StringIO(temp), sep='\$\$\$Field\$\$\$',engine='python') 
print (df) 

唯一的原因,为什么我用熊猫是因为这个字符串实际上是一个巨大的.csv文件,我不能在同一时间阅读这一切都在内存中,但流处理是可以接受的。

+1

除去不需要'\ N'使用'温度= “”。加入输入本身,(temp.split (“\ n”))' – ZdaR

+0

我们希望保留所有的\ n,但作为字符串的一部分,如示例中的“Fried \ nChicken”。 – Arturo

+0

你想要的DataFrame是什么样的?新行字符是表格文件的默认行分隔符,因此需要有一种方法来区分它是否是行分隔符或保存在字符串中。 DataFrame应该看起来像'['Food','Fried \ nChicken','Banana']'。我们不想使用行分隔符,所有新行应保存在字符串中 – victor

回答

2

由于您不想以表格格式存储您的信息,因此我认为不需要DataFrame。相反,读取字符串块并在每次遇到'$$$Field$$$'时生成缓冲区。

https://stackoverflow.com/a/16260159/4410590改编:

def myreadlines(f, newline): 
    buf = "" 
    while True: 
     while newline in buf: 
      pos = buf.index(newline) 
      yield buf[:pos] 
      buf = buf[pos + len(newline):] 
     chunk = f.read(4096) 
     if not chunk: 
      yield buf 
      break 
     buf += chunk 

然后调用函数:

> for x in myreadlines(StringIO(temp), '$$$Field$$$'): 
     print repr(x) 

u'Food' 
u'Fried\nChicken' 
u'Banana' 
+0

很好,如果读取的字节块切断分隔符会怎样。例如块中的最后字节可能是“.... Field $” – putonspectacles

+0

@putonspectacles良好的捕获。用更好的函数更新来处理这个问题。 – victor

1

以及本应该做的事情,你想只是把它扩展到多行:

df = pd.DataFrame("""Food$$$Field$$$Fried 
Chicken$$$Field$$$Banana""".split("$$$Field$$$")).T 

print(df) 

不同的地方(如何)你的文本存储只是你可以做一个列表理解分裂:

df = pd.DataFrame(lines.split("$$$Field$$$") for line in lines).T 
+0

听起来不错。如果不是字符串,它是一个巨大的.csv文件,其中包含该文本?我只是用一个字符串来使问题更容易理解。 – Arturo

+0

什么是csv文件中的分隔符,逗号? – putonspectacles

+1

如果OP试图避免将字符串读入内存,则不能在整个字符串中调用“split”而不将其全部读入内存。 – victor