Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python解析用户名的大型CSV文件_Python_Csv_Large Files - Fatal编程技术网

Python解析用户名的大型CSV文件

Python解析用户名的大型CSV文件,python,csv,large-files,Python,Csv,Large Files,我有一个非常大的csv文件(+50k行) 此文件包含IRC日志,以下是数据格式: 第1列:消息类型(1为消息,2为系统) 第二列:时间戳(自精确日期起的秒数) 第三列:写消息者的用户名 第四栏:信息 下面是一个数据示例: 11382445487956,“鲍勃”,“我不知道怎么做这样的任务” 11382025765196,“爱丽丝”,“兄弟问我” 11382454875476,“我很确定用python可以做到,鲍勃” 21380631520410,“helloman”,“helloman_uu

我有一个非常大的csv文件(+50k行)

此文件包含IRC日志,以下是数据格式:

  • 第1列:消息类型(1为消息,2为系统)
  • 第二列:时间戳(自精确日期起的秒数)
  • 第三列:写消息者的用户名
  • 第四栏:信息
下面是一个数据示例:

11382445487956,“鲍勃”,“我不知道怎么做这样的任务”
11382025765196,“爱丽丝”,“兄弟问我”
11382454875476,“我很确定用python可以做到,鲍勃”
21380631520410,“helloman”,“helloman_uu加入成龙。”
例如,
\u XxCoder\u killerxX\u
提到了
bob

所以,知道了所有这些,我想知道哪对用户名相互提及最多。

我希望消息被计数,因此我只需要处理以数字“1”开头的行(因为有一堆以“2”开头的行和其他不相关的数字)


我知道可以使用
csv
Python模块来完成,但我从未使用过如此大的文件,所以我真的不知道如何开始所有这些。

您应该执行csv的两个过程:一个是捕获所有发送者用户名,另一个是查找消息中提到的发送者用户名

import csv

users = set()

with open("test.csv", "r") as file:
    reader = csv.reader(file)
    for line in reader:
        users.add(line[2])

mentions = {}

with open("test.csv", "r") as file:
    reader = csv.reader(file)
    for line in reader:
        sender, message = line[2], line[3]
        for recipient in users:
            if recipient == sender:
                continue  # can't mention yourself
            if recipient in message:
                key = (sender, recipient)
                mentions[key] = mentions.get(key, 0) + 1

for mention, times in mentions.items():
    print(f"{mention[0]} mentioned {mention[1]} {times} time(s)")


totals = {}

for mention, times in mentions.items():
    key = tuple(sorted(mention))
    totals[key] = totals.get(key, 0) + times

for names, times in totals.items():
    print(f"{names[0]} and {names[1]} mentioned each other {times} time(s)")

这个例子很幼稚,因为它正在执行简单的子字符串匹配。因此,如果有人叫“foo”,有人在消息中提到“food”,则表示匹配。

您应该执行两次CSV传递:一次捕获所有发件人用户名,另一次查找消息中提到的发件人用户名

import csv

users = set()

with open("test.csv", "r") as file:
    reader = csv.reader(file)
    for line in reader:
        users.add(line[2])

mentions = {}

with open("test.csv", "r") as file:
    reader = csv.reader(file)
    for line in reader:
        sender, message = line[2], line[3]
        for recipient in users:
            if recipient == sender:
                continue  # can't mention yourself
            if recipient in message:
                key = (sender, recipient)
                mentions[key] = mentions.get(key, 0) + 1

for mention, times in mentions.items():
    print(f"{mention[0]} mentioned {mention[1]} {times} time(s)")


totals = {}

for mention, times in mentions.items():
    key = tuple(sorted(mention))
    totals[key] = totals.get(key, 0) + times

for names, times in totals.items():
    print(f"{names[0]} and {names[1]} mentioned each other {times} time(s)")

这个例子很幼稚,因为它正在执行简单的子字符串匹配。因此,如果有人叫“foo”,有人在消息中提到“food”,则表示匹配。

这里有一个使用pandas和set的解决方案。熊猫的使用大大简化了csv数据的导入和操作,集合的使用允许将{'alice','bob'}和{'bob','alice'}计算为相同组合的两个实例

df = pd.read_csv('sample.csv', header=None)
df.columns = ['id','timestamp','username','message']

lst = []
for name in df.username:
    for i,m in enumerate(df.message):
        if name in m:
            author = df.iloc[i,2]
            lst.append({author, name})
most_freq = max(lst, key=lst.count)

print(most_freq)
#{'bob', '_XxCoder_killerxX_'}

下面是一个使用熊猫和集合的解决方案。熊猫的使用大大简化了csv数据的导入和操作,集合的使用允许将{'alice','bob'}和{'bob','alice'}计算为相同组合的两个实例

df = pd.read_csv('sample.csv', header=None)
df.columns = ['id','timestamp','username','message']

lst = []
for name in df.username:
    for i,m in enumerate(df.message):
        if name in m:
            author = df.iloc[i,2]
            lst.append({author, name})
most_freq = max(lst, key=lst.count)

print(most_freq)
#{'bob', '_XxCoder_killerxX_'}


你知道如何处理小文件吗?我会说我会将所有用户名保存到dict中,然后检查所有消息,以确定是否有人提及,然后我必须将它们计算出来,以找到数量最多的一个?是的。。。你试过了吗?有问题吗?是的,我一直在尝试,但我想不出存储数据的方法,我知道如何存储所有用户名,但不知道如何计算配对用户名相互提及的次数。使用
pandas
这将非常简单。你知道如何处理小文件吗?我会说我会将所有用户名保存到dict中,然后检查所有消息,以确定是否有人提及,然后我必须数一数,找出人数最多的那个?是的。。。你试过了吗?有问题吗?是的,我一直在尝试,但我想不出一种存储数据的方法,我知道如何存储所有用户名,但不知道如何计算两个用户名相互提及的次数。这将非常容易使用
pandas
哇,差不多完成了,我如何知道现在相互提及最多的两个用户名呢?在上面的示例中添加了代码。我会让你找到最大的数量。非常感谢你的编辑!但您的代码似乎给了我自我提及的结果,例如
bob bob相互提及了X次
我已经改进了代码以避免提及您自己。请随意增强示例以满足您的独特需求。哇,差不多完成了,我如何知道现在相互提及最多的两个用户名呢?在上面的示例中添加了代码。我会让你找到最大的数量。非常感谢你的编辑!但是,您的代码似乎给了我自我提及的结果,例如,
bob bob相互提及了X次
我改进了代码,以避免提及您自己。请随意增强示例以满足您的独特需要。如果您要这样做,您真的不应该使用
pandas
。而且,
most_freq=max(lst,key=lst.count)
效率非常低。使用pandas也很好。我想他的意思是,我没有使用pandas数据帧的全部功能,因为我在遍历它的列。在本例中,我只是使用dataframe来存储数据。csv文件中的731行似乎由于太多双引号而损坏。要么删除它,要么将其更改为11380877652084,“Lukaaas”,即“九倍于它必须是的,否”,是的。df=pd.Dataframe(您的命令)您也可以尝试df=pd.read\u csv('sample.csv',header=None,skiprows=[731])。玩这个数字。如果731不工作,请尝试730或732。另外,如果您收到关于其他损坏行的erros消息,您可以通过skiprows=[731921,…]跳过它们。如果要这样做,您真的不应该使用
pandas
。而且,
most_freq=max(lst,key=lst.count)
效率非常低。使用pandas也很好。我想他的意思是,我没有使用pandas数据帧的全部功能,因为我在遍历它的列。在本例中,我只是使用dataframe来存储数据。csv文件中的731行似乎由于太多双引号而损坏。要么删除它,要么将其更改为11380877652084,“Lukaaas”,即“九倍于它必须是的,否”,是的。df=pd.Dataframe(您的命令)您也可以尝试df=pd.read\u csv('sample.csv',header=None,skiprows=[731])。玩这个数字。如果731不工作,请尝试730或732。此外,如果您收到关于其他损坏线路的erros消息,您可以通过skiprows跳过它们=