1题目要求:
文本文件有这些数据,需要的只有其中的5个属性,如下颜色标记
像以下的数据达到75万组:
1product/productId: B0000UIXZ4 2product/title: Timex Link USB Watch 3product/price: unknown 4review/userId: A14MVG2I9PS6NZ 5review/profileName: B. Kuiper "Wah" 6review/helpfulness: 0/0 7review/score: 5.0 8review/time: 1275091200 9review/summary: Best geek weapon ever...but no longer made? 10review/text: This watch serves as my brain and now, my brain is no lo
2基于Python进行粗略读取
代码如下:没有对输出进行处理,只是简单筛选
fo.write();写入文件的的时候注意的地方:3.X与2.X的写入文件的类型不同
写入错误: TypeError: a bytes-like object is required, not 'str' ------------------------------------------------------------- btest.decode('utf-8') #结果'abcde' strtest.encode('utf-8') #结果b'abc'
need = ['product/productId:','product/price:','review/helpfulness:','review/score:','review/time:'] fo = open("C:\Users\Five\Desktop\新建文件夹\python2.txt", "wb") for line in open("C:\Users\Five\Desktop\新建文件夹\Watches.txt"): flag = 0; for i in range(0,5): if line.find(need[i])==0:flag =1;break; if flag==1:fo.write((line+' ').encode('utf-8')); fo.close();
读取文件的方式有以下:
f = open("foo.txt") # 返回一个文件对象 line = f.readline() # 调用文件的 readline()方法 while line: .... line = f.readline() ---------------------------------------------------- for line in open("foo.txt"): ---------------------------------------------------- f = open("c:\1.txt","r") lines = f.readlines()#读取全部内容 for line in lines print line
3基于C语言的详细读取
读取并处理的结果如下:
预备知识读取的方式
fp=fopen("python.txt","r"); fscanf(fp,"%s",&s); printf("%s ",s); 里面是按空格分开来读取的。 下面是按行读取的 -------------------------------------- fgets(s,1028*8,fp); fgets(s,1028*8,fp)读取的长度比=实际+1(换行符分界) printf("%s",s); ---------------------------------------- fscanf(fp,"%[^ ]",&s); -------------------------------
打开方式详细如下:
对于文件使用方式有以下几点说明: 1) 文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是: r(read): 读 w(write): 写 a(append): 追加 t(text): 文本文件,可省略不写 b(banary): 二进制文件 +: 读和写 意义 “rt” 只读打开一个文本文件,只允许读数据 “wt” 只写打开或建立一个文本文件,只允许写数据 “at” 追加打开一个文本文件,并在文件末尾写数据 “rb” 只读打开一个二进制文件,只允许读数据 “wb” 只写打开或建立一个二进制文件,只允许写数据 “ab” 追加打开一个二进制文件,并在文件末尾写数据 “rt+” 读写打开一个文本文件,允许读和写 “wt+” 读写打开或建立一个文本文件,允许读写 “at+” 读写打开一个文本文件,允许读,或在文件末追加数据 “rb+” 读写打开一个二进制文件,允许读和写 “wb+” 读写打开或建立一个二进制文件,允许读和写 “ab+” 读写打开一个二进制文件,允许读,或在文件末追加数据
处理的结果:(对于product/price: unknown 这一类未知的置为0处理)
B000NLZ4A2 0 0/0 4.0 1260230400 B000NLZ4A2 0 0/0 4.0 1216339200 B000NLZ4A2 0 1/2 5.0 1245024000 B000AIO6RA 0 3/3 5.0 1122422400 B000AIO6RA 0 0/0 4.0 1207958400 B000NLZ4AM 0 2/2 4.0 1250208000 B000NLZ4AM 0 2/2 5.0 1244764800 B000NLZ4AM 0 2/2 5.0 1243296000 B000NLZ4AM 0 1/1 4.0 1235952000 B000NLZ4AM 0 0/0 5.0 1236816000 B000F70V0M 0 1/1 5.0 1189468800 B000F70V0M 0 0/0 4.0 1244678400 B000F70V0M 0 0/0 5.0 1204502400 B000F70V0M 0 0/0 5.0 1201478400 ...... ...... ......以上只是一部分数据
详细代码如下:
#include<stdio.h> #include<string.h> void getValue(char s[],char temp[]){ int end = strlen(s); int start =0; int i =0,j=-1; char c; for(i=end-2;s[i]!=' ';i--){ temp[++j]= s[i]; } // printf(" "); temp[j+1]=' '; for(i=0;i<=j;){ c=temp[i]; temp[i]=temp[j]; temp[j]=c; i++;j--; } } int main(){ FILE *fr,*fw; int data,count; long int sum=0; char s[100000];//读取一行数据 char temp[20];//截取空格后面的Value char s1[20],s2[20],s3[20],s4[20],s5[20];//需要的5个属性Value char unknow[]="unknown"; char zero[]="0"; fr=fopen("Watches.txt","r"); fw=fopen("p.txt","wt"); count=1; while(fgets(s,1028*80,fr)!=NULL){ // printf("%s",s); if(count!=11) getValue(s,temp); if(count==1) strcpy(s1,temp); else if(count==3){ strcpy(s2,temp); if(strcmp(s2,unknow)==0) strcpy(s2,zero); } else if(count==6) strcpy(s3,temp); else if(count==7) strcpy(s4,temp); else if(count==8) strcpy(s5,temp); if(count==11){ fprintf(fw,"%s %s %s %s %s ",s1,s2,s3,s4,s5); count=0; } sum++; count++; fflush(fw); printf("%ld ",sum); } printf("%ld",sum); fclose(fw); printf("press any key to end! "); getchar(); return 0; }