Python:在多个CSV中引用字符串并将文件合并在一起
我有一个大约600个CSV文件的目录,其中包含twitter数据,有多种类型的int、float和string字段。我有一个脚本,可以将文件合并在一起,但是字符串字段本身可以包含逗号,并且不会被引用,这会导致字符串字段分离,并强制在新行上显示文本。是否可以引用每个文件中的字符串,然后将其合并到单个文件中?下面是我用来合并文件和一些示例数据的脚本 合并脚本: %%时间 导入csv 导入glob 从TQM导入TQMPython:在多个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
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)