Python:在多个CSV中引用字符串并将文件合并在一起

Python:在多个CSV中引用字符串并将文件合并在一起,python,python-2.7,csv,merge,nlp,Python,Python 2.7,Csv,Merge,Nlp,我有一个大约600个CSV文件的目录,其中包含twitter数据,有多种类型的int、float和string字段。我有一个脚本,可以将文件合并在一起,但是字符串字段本身可以包含逗号,并且不会被引用,这会导致字符串字段分离,并强制在新行上显示文本。是否可以引用每个文件中的字符串,然后将其合并到单个文件中?下面是我用来合并文件和一些示例数据的脚本 合并脚本: %%时间 导入csv 导入glob 从TQM导入TQM with open('C:\Python\Scripts\Test_tweets\T

我有一个大约600个CSV文件的目录,其中包含twitter数据,有多种类型的int、float和string字段。我有一个脚本,可以将文件合并在一起,但是字符串字段本身可以包含逗号,并且不会被引用,这会导致字符串字段分离,并强制在新行上显示文本。是否可以引用每个文件中的字符串,然后将其合并到单个文件中?下面是我用来合并文件和一些示例数据的脚本

合并脚本: %%时间 导入csv 导入glob 从TQM导入TQM

with open('C:\Python\Scripts\Test_tweets\Test_output.csv', 'wb') as f_output:
    csv_output = csv.writer(f_output, quoting=csv.QUOTE_NONNUMERIC)
    write_header = True

    for filename in tqdm(glob.glob(r'C:\Python\Scripts\Test_tweets\*.csv')):
        with open(filename, 'rb') as f_input:
            csv_input = csv.reader(f_input)
            header = next(csv_input)

            if write_header:
                csv_output.writerow(header)
                write_header = False

            for row in tqdm(csv_input):
                row = row[:7] + [','.join(row[7:])]

                # Skip rows with insufficient values                
                if len(row) > 7:
                    row[1] = float(row[1])
                    row[5] = float(row[5])
                    row[6] = float(row[6])
                    csv_output.writerow(row)
样本数据:

2014-02-07T00:25:40Z,43158451542198272,Falsalarm_xox,en,--81.4994315,35.3268904,仍然在做头发,仍然在做头发 2014-02-07T00:25:40Z,4315845151525003265,enabrkovic,en,--85.40364208,40.19369368,我没有课要做为什么我要等630开始做所有事情,我今天没有课为什么我要等630开始做所有事情
2014-02-07T00:25:41Z,431584515757457408,宾夕法尼亚州比克尔,样本数据已损坏。正确数据:

import csv


def get_number(value):
    "Convert numberic strings into ints and floats"

    try:
        value = int(value)
    except ValueError:
        try:
            value = float(value)
        except ValueError:
            pass

    return value


with open('output.csv', 'wb') as f_output:
    csv_output = csv.writer(f_output, quoting=csv.QUOTE_NONNUMERIC)
    write_header = True

    with open('sample.csv') as f_input:
        header = next(f_input).strip().split(',')

        if write_header:
            csv_output.writerow(header)
            write_header = False

        for row in f_input:
            row = [get_number(value) for value in row.strip().split(',', 7)]
            csv_output.writerow(row)

包含换行符、双引号和逗号的字段 应该用双引号括起来。例如:

aaa,b CRLF

bb,ccc-CRLF

zzz,yyy,xxx


如果您同意将最后两个字段合并为一个字符串,那么以下方法应该有效:

使用变量确定是否需要写入标头。始终使用“下一步”先读取标题。如果为True,则写入标头,否则放弃它。 首先剥去这一行,把它分开,七次。然后将最后两个字符串字段保留为单个值。 接下来,使用函数尝试将每个字段转换为整数或浮点。 使用csv quoting=csv.QUOTE_非数值选项强制对所有剩余字符串值引用。 这可以通过以下方式完成:

import csv

with open('output.csv', 'wb') as f_output:
    csv_output = csv.writer(f_output, quoting=csv.QUOTE_NONNUMERIC)
    write_header = True

    with open('sample.csv', 'rb') as f_input:
        csv_input = csv.reader(f_input)
        header = next(csv_input)

        if write_header:
            csv_output.writerow(header)
            write_header = False

        for row in csv_input:
            row = row[:7] + [','.join(row[7:])]

            # Skip rows with insufficient values                
            if len(row) > 7:
                row[1] = int(row[1])
                row[5] = float(row[5])
                row[6] = float(row[6])
                csv_output.writerow(row)
这将使您的输出开始:

1/1/1,1,用户名1,en,-39.0162,梦幻般。半感官的。有点可怕。该网站与其说是一个推特玩具,不如说是一个进入我潜意识的令人不安的窥视者,就像做梦一样。半感官的。有点可怕。该网站与其说是一个推特玩具,不如说是一个进入我潜意识的令人不安的窥视者。 1/1/2,2,username2,en,-,84.0147,可以预见,结果是非常有趣的。我自己也说得再好不过了,可以预见,结果是非常有趣的。我自己也说得再好不过了 1/1/3,3,username3,en,--22.0,-180,这个网站今天早上在推特办公室提供了一些好的笑声。这个网站今天早上在推特办公室提供了一些好的笑声。 1/1/4,4,用户名4,恩,-28.0,-49,你可以想象这样的东西在五年、十年或二十年后会是什么样子,随着我们技术能力的提高,你可以想象这样的东西在五年、十年或二十年后会是什么样子,随着我们技术能力的提高 这种方法可以扩展到处理多个输入文件

如果您的一些数据已经被引用,并且int和float位于已知列中,那么需要一种不同的方法。示例数据仅显示未引用的数据

import csv
import glob

with open('output.csv', 'wb') as f_output:
    csv_output = csv.writer(f_output, quoting=csv.QUOTE_NONNUMERIC)
    write_header = True

    for filename in glob.glob(r'C:\Python\Scripts\Test_tweets\*.csv'):
        with open(filename, 'rb') as f_input:
            csv_input = csv.reader(f_input)
            header = next(csv_input)

            if write_header:
                csv_output.writerow(header)
                write_header = False

            for row in csv_input:
                row = row[:7] + [','.join(row[7:])]

                # Skip rows with insufficient values                
                if len(row) > 7:
                    row[1] = int(row[1])
                    row[5] = float(row[5])
                    row[6] = float(row[6])
                    csv_output.writerow(row)
要使用多个文件,您需要添加一个循环来读取每个CSV文件名,例如:


注意:不要忘记在文件夹字符串前面加上r,以阻止Python尝试转义\字符。

行的最后一列是整个字符串字段吗?字符串包含在每行的五个字段2、3、4、7、8中:datedate、UserId、usernamestr、langstr、dashstr、longitudefloat、latitudefloat、textfield1str、,textfield2Str然后这是一个挑战,因为您在末尾有两个字符串,其中两个字符串都可以有多个逗号,并且您的字符串不带引号。将行拆分为多个部分后,如果您同意的话,可以将所有数据行[7:]合并为一个字符串。我没有这样想-是的,将最后两个字符串合并为一个字符串是有效的,因为每个文件中的最后两个字符串似乎相同。我不明白您的意思。示例数据已正确损坏-我需要做的是在多个文件中正确引用字符串,然后将这些文件合并在一起。我必须删除换行符='',并以“wb”的形式打开文件。我使用的是Python 2.7。脚本运行在一个测试文件上,但它看起来像int和float偶尔被引用,而不仅仅是strEx:2014-02-08T00:00:01Z,4.3194E+17,纽瓦克威瑟,in,-75.68444444,39.695,02 07@19 00温度31.0华氏度wc 31.0华氏度风0.0华氏度阵风0.0华氏度巴30.358华氏度上升雨0.00华氏度紫外线0.0.0度太阳辐射0,02/07@19:00-温度31.0华氏度,工作温度31.0华氏度。风速0.0英里/小时--,阵风0.0英里/小时。棒30.358英寸,上升。降雨量0.00英寸。哼68%。紫外线0.0。SolarRad 0.,,,,,,,,,,,,,能否将问题项添加到问题中的示例数据中?请注意,默认引用通常是最好的方法。这会使所有内容都不带引号,除非该项包含逗号或换行符。任何应用程序
n读取此信息将自动正确读取此信息。在Excel中,有时需要使用Data->From text导入方法。在脚本中添加一些调试代码,或者尝试使用我的第二种方法示例。如果行中的元素数错误,您可以打印在处理前读入的行,并了解其原因,或者在问题中向示例数据中添加有问题的行。我添加了一个未经测试的多文件示例,您需要重新组织循环逻辑。
import csv
import glob

with open('output.csv', 'wb') as f_output:
    csv_output = csv.writer(f_output, quoting=csv.QUOTE_NONNUMERIC)
    write_header = True

    for filename in glob.glob(r'C:\Python\Scripts\Test_tweets\*.csv'):
        with open(filename, 'rb') as f_input:
            csv_input = csv.reader(f_input)
            header = next(csv_input)

            if write_header:
                csv_output.writerow(header)
                write_header = False

            for row in csv_input:
                row = row[:7] + [','.join(row[7:])]

                # Skip rows with insufficient values                
                if len(row) > 7:
                    row[1] = int(row[1])
                    row[5] = float(row[5])
                    row[6] = float(row[6])
                    csv_output.writerow(row)